From 3f3ab93a480e317c42c636bd2621a52ff7ee138c Mon Sep 17 00:00:00 2001 From: Mike Baker Date: Tue, 25 May 2004 04:32:27 +0000 Subject: [PATCH] Initial revision SVN-Revision: 30 --- obsolete-buildroot/.cvsignore | 4 + obsolete-buildroot/Makefile | 370 + obsolete-buildroot/README | 42 + obsolete-buildroot/make/autoconf.mk | 72 + obsolete-buildroot/make/automake.mk | 74 + obsolete-buildroot/make/bash.mk | 71 + obsolete-buildroot/make/berkeleydb.mk | 94 + obsolete-buildroot/make/binutils-uclibc.mk | 120 + obsolete-buildroot/make/bison.mk | 62 + obsolete-buildroot/make/boa.mk | 57 + obsolete-buildroot/make/bridge.mk | 62 + obsolete-buildroot/make/busybox.mk | 59 + obsolete-buildroot/make/bzip2.mk | 86 + obsolete-buildroot/make/ccache.mk | 147 + obsolete-buildroot/make/coreutils.mk | 82 + obsolete-buildroot/make/cramfsroot.mk | 52 + obsolete-buildroot/make/customize.mk | 10 + obsolete-buildroot/make/dhcp_relay.mk | 47 + obsolete-buildroot/make/diffutils.mk | 61 + obsolete-buildroot/make/dnsmasq.mk | 50 + obsolete-buildroot/make/dropbear_sshd.mk | 74 + obsolete-buildroot/make/ed.mk | 55 + obsolete-buildroot/make/ext2root.mk | 56 + obsolete-buildroot/make/fakeroot.mk | 63 + obsolete-buildroot/make/file.mk | 64 + obsolete-buildroot/make/findutils.mk | 70 + obsolete-buildroot/make/flex.mk | 81 + obsolete-buildroot/make/gawk.mk | 66 + obsolete-buildroot/make/gcc-uclibc-2.95.mk | 276 + obsolete-buildroot/make/gcc-uclibc-3.3.mk | 267 + obsolete-buildroot/make/gdb.mk | 80 + obsolete-buildroot/make/gdbserver.mk | 53 + obsolete-buildroot/make/gettext.mk | 60 + obsolete-buildroot/make/grep.mk | 73 + obsolete-buildroot/make/gzip.mk | 70 + obsolete-buildroot/make/hostap.mk | 53 + obsolete-buildroot/make/hotplug.mk | 39 + obsolete-buildroot/make/iproute2.mk | 57 + obsolete-buildroot/make/iptables.mk | 51 + obsolete-buildroot/make/jffs2root.mk | 49 + obsolete-buildroot/make/jpeg.mk | 73 + obsolete-buildroot/make/kernel-headers.mk | 85 + obsolete-buildroot/make/less.mk | 48 + obsolete-buildroot/make/libfloat.mk | 55 + obsolete-buildroot/make/libglib12.mk | 79 + obsolete-buildroot/make/libmad.mk | 56 + obsolete-buildroot/make/libtool.mk | 77 + obsolete-buildroot/make/links.mk | 54 + obsolete-buildroot/make/linux.mk | 113 + obsolete-buildroot/make/lrzsz.mk | 76 + obsolete-buildroot/make/ltp-testsuite.mk | 39 + obsolete-buildroot/make/ltrace.mk | 48 + obsolete-buildroot/make/lzo.mk | 65 + obsolete-buildroot/make/m4.mk | 65 + obsolete-buildroot/make/make.mk | 61 + obsolete-buildroot/make/microcom.mk | 59 + obsolete-buildroot/make/microwin.mk | 46 + obsolete-buildroot/make/mkdosfs.mk | 44 + obsolete-buildroot/make/mke2fs.mk | 71 + obsolete-buildroot/make/mpg123.mk | 45 + obsolete-buildroot/make/mrouted.mk | 45 + obsolete-buildroot/make/ncurses.mk | 133 + obsolete-buildroot/make/netfilter.mk | 49 + obsolete-buildroot/make/netkitbase.mk | 57 + obsolete-buildroot/make/netkittelnet.mk | 59 + obsolete-buildroot/make/netsnmp.mk | 105 + obsolete-buildroot/make/newt.mk | 72 + obsolete-buildroot/make/ntp.mk | 62 + obsolete-buildroot/make/openssh.mk | 78 + obsolete-buildroot/make/openssl.mk | 78 + obsolete-buildroot/make/openvpn.mk | 68 + obsolete-buildroot/make/openwrt.mk | 270 + obsolete-buildroot/make/patch.mk | 60 + obsolete-buildroot/make/pciutils.mk | 71 + obsolete-buildroot/make/pcmcia.mk | 108 + obsolete-buildroot/make/pppd.mk | 68 + obsolete-buildroot/make/python.mk | 57 + obsolete-buildroot/make/raidtools.mk | 59 + obsolete-buildroot/make/rxvt.mk | 70 + obsolete-buildroot/make/sed.mk | 136 + obsolete-buildroot/make/sfdisk.mk | 36 + obsolete-buildroot/make/slang.mk | 48 + obsolete-buildroot/make/socat.mk | 67 + obsolete-buildroot/make/squashfsroot.mk | 51 + obsolete-buildroot/make/strace.mk | 59 + obsolete-buildroot/make/system-linux.mk | 59 + obsolete-buildroot/make/tar.mk | 66 + obsolete-buildroot/make/tinylogin.mk | 52 + obsolete-buildroot/make/tinyx.mk | 127 + obsolete-buildroot/make/tn5250.mk | 51 + obsolete-buildroot/make/ttcp.mk | 37 + obsolete-buildroot/make/uclibc.mk | 184 + obsolete-buildroot/make/udhcp.mk | 64 + obsolete-buildroot/make/util-linux.mk | 69 + obsolete-buildroot/make/valgrind.mk | 88 + obsolete-buildroot/make/vtun.mk | 66 + obsolete-buildroot/make/wtools.mk | 50 + obsolete-buildroot/make/zlib.mk | 72 + obsolete-buildroot/sources/.cvsignore | 1 + .../sources/STLport-4.5.3.patch | 407 + .../sources/binutils-uclibc-001-debian.patch | 2394 ++++ .../sources/binutils-uclibc-100-conf.patch | 646 + .../binutils-uclibc-200-build_modules.patch | 31 + .../sources/binutils-uclibc-210-cflags.patch | 32 + .../sources/boa-config.site-i386 | 1 + obsolete-buildroot/sources/boa.conf | 187 + obsolete-buildroot/sources/bridge.patch | 11 + .../busybox-openwrt-100-killall5.patch | 87 + .../sources/busybox-openwrt-110-telnetd.patch | 53 + .../sources/busybox-openwrt-120-udhcp.patch | 129 + .../busybox-openwrt-130-resetmon.patch | 89 + obsolete-buildroot/sources/busybox.config | 459 + .../sources/busybox.config-openwrt | 478 + obsolete-buildroot/sources/cramfs.patch | 1269 ++ obsolete-buildroot/sources/device_table.txt | 163 + .../sources/dnsmasq1-100-bugfix.patch | 25 + .../sources/dnsmasq1-openwrt.patch | 219 + .../sources/dnsmasq2-100-config.patch | 49 + obsolete-buildroot/sources/file.patch | 30 + .../sources/gcc-uclibc-3.3-100-conf.patch | 1593 +++ .../sources/gcc-uclibc-3.3-110-conf.patch | 55 + .../gcc-uclibc-3.3-120-softfloat.patch | 14 + .../sources/gcc-uclibc-3.3-200-code.patch | 3021 ++++ .../sources/gcc-uclibc-3.3-loop.patch | 10 + .../sources/gcc2.95-mega.patch.bz2 | Bin 0 -> 125297 bytes .../sources/gcc2.95-uclibc-conf.patch | 291 + .../sources/gcc3.3-mega.patch.bz2 | Bin 0 -> 153371 bytes .../sources/gdb-5.3-uclibc.patch | 154 + obsolete-buildroot/sources/gdb.patch | 633 + obsolete-buildroot/sources/genext2fs.patch | 2457 ++++ obsolete-buildroot/sources/hotplug.patch | 33 + .../sources/i386-gcc-soft-float.patch | 61 + .../sources/iptables-openwrt-extensions.patch | 21 + .../kernel-patches/001-patch-2.4.26-pre5.bz2 | Bin 0 -> 729361 bytes .../kernel-patches/006-ieee1394-hotplug.bz2 | Bin 0 -> 339 bytes .../007-scsi_add_remove_single.bz2 | Bin 0 -> 2990 bytes .../kernel-patches/008-ieee1394-fix.bz2 | Bin 0 -> 390 bytes .../kernel-patches/009-always-inline.bz2 | Bin 0 -> 468 bytes .../kernel-patches/010-optimize-for-size.bz2 | Bin 0 -> 1186 bytes .../kernel-patches/012-x86-check_gcc.bz2 | Bin 0 -> 329 bytes .../sources/kernel-patches/017-printk.bz2 | Bin 0 -> 336 bytes .../kernel-patches/018-slab-loop-init.bz2 | Bin 0 -> 268 bytes .../kernel-patches/041-changeloop.patch.bz2 | Bin 0 -> 2783 bytes .../kernel-patches/042-loopfixes.patch.bz2 | Bin 0 -> 640 bytes .../kernel-patches/044-streaming_io.bz2 | Bin 0 -> 1743 bytes .../kernel-patches/062-silence-blk-queue.bz2 | Bin 0 -> 382 bytes .../kernel-patches/063-silence.kbd.patch.bz2 | Bin 0 -> 506 bytes .../sources/kernel-patches/064-shutup-md.bz2 | Bin 0 -> 501 bytes .../kernel-patches/077-orinoco-0.13e.bz2 | Bin 0 -> 7472 bytes .../sources/kernel-patches/078-hostap.bz2 | Bin 0 -> 90852 bytes .../sources/kernel-patches/079-jiffies64.bz2 | Bin 0 -> 5066 bytes .../kernel-patches/089-no-touch-makedep.bz2 | Bin 0 -> 858 bytes .../sources/kernel-patches/100_VERSION.bz2 | Bin 0 -> 236 bytes obsolete-buildroot/sources/libfloat.patch | 45 + .../sources/libglib_configure_1.2.10.bz2 | Bin 0 -> 8884 bytes obsolete-buildroot/sources/linux.config | 877 ++ .../sources/ltp-testsuite.patch | 59 + .../sources/lzo-cross-compile.patch | 43 + obsolete-buildroot/sources/mime.types | 205 + .../sources/mrouted-sys_errlist.patch | 44 + obsolete-buildroot/sources/netkittelnet.patch | 171 + obsolete-buildroot/sources/netsnmp.patch | 32 + obsolete-buildroot/sources/openssh.patch | 289 + obsolete-buildroot/sources/openssl.patch | 238 + obsolete-buildroot/sources/openvpn | 103 + obsolete-buildroot/sources/openwrt-diag.c | 137 + .../sources/openwrt-linux-netfilter.patch | 5823 ++++++++ .../sources/openwrt-wrt54g-linux.config | 843 ++ .../sources/openwrt-wrt54g-linux.patch | 1791 +++ .../sources/openwrt-wrt54g-router.patch | 240 + .../sources/openwrt-wrt54g-shared.patch | 11 + obsolete-buildroot/sources/patch-kernel.sh | 53 + obsolete-buildroot/sources/pcmcia.patch | 123 + .../sources/perl-cross-0.1.tar.gz | Bin 0 -> 11872 bytes obsolete-buildroot/sources/perl.patch | 996 ++ obsolete-buildroot/sources/sedcheck.sh | 21 + obsolete-buildroot/sources/skel.tar.gz | Bin 0 -> 4846 bytes .../sources/specs-arm-soft-float | 124 + .../sources/specs-mips-soft-float | 145 + .../sources/specs-mipsel-soft-float | 145 + .../sources/specs-powerpc-soft-float | 352 + obsolete-buildroot/sources/squashfs.patch | 36 + .../sources/target_skeleton/etc/TZ | 1 + .../sources/target_skeleton/etc/fstab | 8 + .../sources/target_skeleton/etc/group | 10 + .../sources/target_skeleton/etc/hostname | 1 + .../sources/target_skeleton/etc/hosts | 1 + .../target_skeleton/etc/init.d/S20urandom | 44 + .../target_skeleton/etc/init.d/S40network | 35 + .../sources/target_skeleton/etc/init.d/rcS | 27 + .../sources/target_skeleton/etc/inittab | 47 + .../sources/target_skeleton/etc/inputrc | 44 + .../sources/target_skeleton/etc/issue | 4 + .../target_skeleton/etc/network/interfaces | 4 + .../sources/target_skeleton/etc/passwd | 13 + .../sources/target_skeleton/etc/profile | 48 + .../sources/target_skeleton/etc/protocols | 31 + .../sources/target_skeleton/etc/random-seed | Bin 0 -> 512 bytes .../sources/target_skeleton/etc/resolv.conf | 2 + .../sources/target_skeleton/etc/securetty | 12 + .../sources/target_skeleton/etc/services | 302 + .../sources/target_skeleton/etc/shadow | 12 + .../target_skeleton/root/.bash_history | 0 .../sources/target_skeleton/root/.bash_logout | 7 + .../target_skeleton/root/.bash_profile | 15 + .../sources/target_skeleton/root/.bashrc | 48 + .../target_skeleton/usr/share/terminfo/a/ansi | Bin 0 -> 1450 bytes .../target_skeleton/usr/share/terminfo/d/dumb | Bin 0 -> 308 bytes .../usr/share/terminfo/l/linux | Bin 0 -> 1551 bytes .../target_skeleton/usr/share/terminfo/r/rxvt | Bin 0 -> 1627 bytes .../usr/share/terminfo/s/screen | Bin 0 -> 1318 bytes .../usr/share/terminfo/s/screen-w | Bin 0 -> 1334 bytes .../target_skeleton/usr/share/terminfo/s/sun | Bin 0 -> 1019 bytes .../usr/share/terminfo/v/vt100 | Bin 0 -> 1143 bytes .../usr/share/terminfo/v/vt220 | Bin 0 -> 975 bytes .../target_skeleton/usr/share/terminfo/v/vt52 | Bin 0 -> 461 bytes .../usr/share/terminfo/x/xterm | Bin 0 -> 1366 bytes .../usr/share/terminfo/x/xterm-xfree86 | Bin 0 -> 1840 bytes .../usr/share/udhcpc/default.script | 39 + obsolete-buildroot/sources/tinyx-011010.patch | 173 + .../sources/uClibc-ldso-0.9.24.patch | 11861 ++++++++++++++++ obsolete-buildroot/sources/uClibc.config | 144 + .../sources/uClibc.config-locale | 134 + .../sources/uClibc.config-openwrt | 144 + obsolete-buildroot/sources/util-linux.patch | 28 + obsolete-buildroot/sources/valgrind.patch | 115 + obsolete-buildroot/sources/vtun.patch | 186 + obsolete-buildroot/sources/yacc | 2 + 228 files changed, 49080 insertions(+) create mode 100644 obsolete-buildroot/.cvsignore create mode 100644 obsolete-buildroot/Makefile create mode 100644 obsolete-buildroot/README create mode 100644 obsolete-buildroot/make/autoconf.mk create mode 100644 obsolete-buildroot/make/automake.mk create mode 100644 obsolete-buildroot/make/bash.mk create mode 100644 obsolete-buildroot/make/berkeleydb.mk create mode 100644 obsolete-buildroot/make/binutils-uclibc.mk create mode 100644 obsolete-buildroot/make/bison.mk create mode 100644 obsolete-buildroot/make/boa.mk create mode 100644 obsolete-buildroot/make/bridge.mk create mode 100644 obsolete-buildroot/make/busybox.mk create mode 100644 obsolete-buildroot/make/bzip2.mk create mode 100644 obsolete-buildroot/make/ccache.mk create mode 100644 obsolete-buildroot/make/coreutils.mk create mode 100644 obsolete-buildroot/make/cramfsroot.mk create mode 100644 obsolete-buildroot/make/customize.mk create mode 100644 obsolete-buildroot/make/dhcp_relay.mk create mode 100644 obsolete-buildroot/make/diffutils.mk create mode 100644 obsolete-buildroot/make/dnsmasq.mk create mode 100644 obsolete-buildroot/make/dropbear_sshd.mk create mode 100644 obsolete-buildroot/make/ed.mk create mode 100644 obsolete-buildroot/make/ext2root.mk create mode 100644 obsolete-buildroot/make/fakeroot.mk create mode 100644 obsolete-buildroot/make/file.mk create mode 100644 obsolete-buildroot/make/findutils.mk create mode 100644 obsolete-buildroot/make/flex.mk create mode 100644 obsolete-buildroot/make/gawk.mk create mode 100644 obsolete-buildroot/make/gcc-uclibc-2.95.mk create mode 100644 obsolete-buildroot/make/gcc-uclibc-3.3.mk create mode 100644 obsolete-buildroot/make/gdb.mk create mode 100644 obsolete-buildroot/make/gdbserver.mk create mode 100644 obsolete-buildroot/make/gettext.mk create mode 100644 obsolete-buildroot/make/grep.mk create mode 100644 obsolete-buildroot/make/gzip.mk create mode 100644 obsolete-buildroot/make/hostap.mk create mode 100644 obsolete-buildroot/make/hotplug.mk create mode 100644 obsolete-buildroot/make/iproute2.mk create mode 100644 obsolete-buildroot/make/iptables.mk create mode 100644 obsolete-buildroot/make/jffs2root.mk create mode 100644 obsolete-buildroot/make/jpeg.mk create mode 100644 obsolete-buildroot/make/kernel-headers.mk create mode 100644 obsolete-buildroot/make/less.mk create mode 100644 obsolete-buildroot/make/libfloat.mk create mode 100644 obsolete-buildroot/make/libglib12.mk create mode 100644 obsolete-buildroot/make/libmad.mk create mode 100644 obsolete-buildroot/make/libtool.mk create mode 100644 obsolete-buildroot/make/links.mk create mode 100644 obsolete-buildroot/make/linux.mk create mode 100644 obsolete-buildroot/make/lrzsz.mk create mode 100644 obsolete-buildroot/make/ltp-testsuite.mk create mode 100644 obsolete-buildroot/make/ltrace.mk create mode 100644 obsolete-buildroot/make/lzo.mk create mode 100644 obsolete-buildroot/make/m4.mk create mode 100644 obsolete-buildroot/make/make.mk create mode 100644 obsolete-buildroot/make/microcom.mk create mode 100644 obsolete-buildroot/make/microwin.mk create mode 100644 obsolete-buildroot/make/mkdosfs.mk create mode 100644 obsolete-buildroot/make/mke2fs.mk create mode 100644 obsolete-buildroot/make/mpg123.mk create mode 100644 obsolete-buildroot/make/mrouted.mk create mode 100644 obsolete-buildroot/make/ncurses.mk create mode 100644 obsolete-buildroot/make/netfilter.mk create mode 100644 obsolete-buildroot/make/netkitbase.mk create mode 100644 obsolete-buildroot/make/netkittelnet.mk create mode 100644 obsolete-buildroot/make/netsnmp.mk create mode 100644 obsolete-buildroot/make/newt.mk create mode 100644 obsolete-buildroot/make/ntp.mk create mode 100644 obsolete-buildroot/make/openssh.mk create mode 100644 obsolete-buildroot/make/openssl.mk create mode 100644 obsolete-buildroot/make/openvpn.mk create mode 100644 obsolete-buildroot/make/openwrt.mk create mode 100644 obsolete-buildroot/make/patch.mk create mode 100644 obsolete-buildroot/make/pciutils.mk create mode 100644 obsolete-buildroot/make/pcmcia.mk create mode 100644 obsolete-buildroot/make/pppd.mk create mode 100644 obsolete-buildroot/make/python.mk create mode 100644 obsolete-buildroot/make/raidtools.mk create mode 100644 obsolete-buildroot/make/rxvt.mk create mode 100644 obsolete-buildroot/make/sed.mk create mode 100644 obsolete-buildroot/make/sfdisk.mk create mode 100644 obsolete-buildroot/make/slang.mk create mode 100644 obsolete-buildroot/make/socat.mk create mode 100644 obsolete-buildroot/make/squashfsroot.mk create mode 100644 obsolete-buildroot/make/strace.mk create mode 100644 obsolete-buildroot/make/system-linux.mk create mode 100644 obsolete-buildroot/make/tar.mk create mode 100644 obsolete-buildroot/make/tinylogin.mk create mode 100644 obsolete-buildroot/make/tinyx.mk create mode 100644 obsolete-buildroot/make/tn5250.mk create mode 100644 obsolete-buildroot/make/ttcp.mk create mode 100644 obsolete-buildroot/make/uclibc.mk create mode 100644 obsolete-buildroot/make/udhcp.mk create mode 100644 obsolete-buildroot/make/util-linux.mk create mode 100644 obsolete-buildroot/make/valgrind.mk create mode 100644 obsolete-buildroot/make/vtun.mk create mode 100644 obsolete-buildroot/make/wtools.mk create mode 100644 obsolete-buildroot/make/zlib.mk create mode 100644 obsolete-buildroot/sources/.cvsignore create mode 100644 obsolete-buildroot/sources/STLport-4.5.3.patch create mode 100644 obsolete-buildroot/sources/binutils-uclibc-001-debian.patch create mode 100644 obsolete-buildroot/sources/binutils-uclibc-100-conf.patch create mode 100644 obsolete-buildroot/sources/binutils-uclibc-200-build_modules.patch create mode 100644 obsolete-buildroot/sources/binutils-uclibc-210-cflags.patch create mode 100644 obsolete-buildroot/sources/boa-config.site-i386 create mode 100644 obsolete-buildroot/sources/boa.conf create mode 100644 obsolete-buildroot/sources/bridge.patch create mode 100644 obsolete-buildroot/sources/busybox-openwrt-100-killall5.patch create mode 100644 obsolete-buildroot/sources/busybox-openwrt-110-telnetd.patch create mode 100644 obsolete-buildroot/sources/busybox-openwrt-120-udhcp.patch create mode 100644 obsolete-buildroot/sources/busybox-openwrt-130-resetmon.patch create mode 100644 obsolete-buildroot/sources/busybox.config create mode 100644 obsolete-buildroot/sources/busybox.config-openwrt create mode 100644 obsolete-buildroot/sources/cramfs.patch create mode 100644 obsolete-buildroot/sources/device_table.txt create mode 100644 obsolete-buildroot/sources/dnsmasq1-100-bugfix.patch create mode 100644 obsolete-buildroot/sources/dnsmasq1-openwrt.patch create mode 100644 obsolete-buildroot/sources/dnsmasq2-100-config.patch create mode 100644 obsolete-buildroot/sources/file.patch create mode 100644 obsolete-buildroot/sources/gcc-uclibc-3.3-100-conf.patch create mode 100644 obsolete-buildroot/sources/gcc-uclibc-3.3-110-conf.patch create mode 100644 obsolete-buildroot/sources/gcc-uclibc-3.3-120-softfloat.patch create mode 100644 obsolete-buildroot/sources/gcc-uclibc-3.3-200-code.patch create mode 100644 obsolete-buildroot/sources/gcc-uclibc-3.3-loop.patch create mode 100644 obsolete-buildroot/sources/gcc2.95-mega.patch.bz2 create mode 100644 obsolete-buildroot/sources/gcc2.95-uclibc-conf.patch create mode 100644 obsolete-buildroot/sources/gcc3.3-mega.patch.bz2 create mode 100644 obsolete-buildroot/sources/gdb-5.3-uclibc.patch create mode 100644 obsolete-buildroot/sources/gdb.patch create mode 100644 obsolete-buildroot/sources/genext2fs.patch create mode 100644 obsolete-buildroot/sources/hotplug.patch create mode 100644 obsolete-buildroot/sources/i386-gcc-soft-float.patch create mode 100644 obsolete-buildroot/sources/iptables-openwrt-extensions.patch create mode 100644 obsolete-buildroot/sources/kernel-patches/001-patch-2.4.26-pre5.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/006-ieee1394-hotplug.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/007-scsi_add_remove_single.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/008-ieee1394-fix.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/009-always-inline.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/010-optimize-for-size.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/012-x86-check_gcc.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/017-printk.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/018-slab-loop-init.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/041-changeloop.patch.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/042-loopfixes.patch.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/044-streaming_io.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/062-silence-blk-queue.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/063-silence.kbd.patch.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/064-shutup-md.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/077-orinoco-0.13e.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/078-hostap.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/079-jiffies64.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/089-no-touch-makedep.bz2 create mode 100644 obsolete-buildroot/sources/kernel-patches/100_VERSION.bz2 create mode 100644 obsolete-buildroot/sources/libfloat.patch create mode 100644 obsolete-buildroot/sources/libglib_configure_1.2.10.bz2 create mode 100644 obsolete-buildroot/sources/linux.config create mode 100644 obsolete-buildroot/sources/ltp-testsuite.patch create mode 100644 obsolete-buildroot/sources/lzo-cross-compile.patch create mode 100644 obsolete-buildroot/sources/mime.types create mode 100644 obsolete-buildroot/sources/mrouted-sys_errlist.patch create mode 100644 obsolete-buildroot/sources/netkittelnet.patch create mode 100644 obsolete-buildroot/sources/netsnmp.patch create mode 100644 obsolete-buildroot/sources/openssh.patch create mode 100644 obsolete-buildroot/sources/openssl.patch create mode 100755 obsolete-buildroot/sources/openvpn create mode 100644 obsolete-buildroot/sources/openwrt-diag.c create mode 100644 obsolete-buildroot/sources/openwrt-linux-netfilter.patch create mode 100644 obsolete-buildroot/sources/openwrt-wrt54g-linux.config create mode 100644 obsolete-buildroot/sources/openwrt-wrt54g-linux.patch create mode 100644 obsolete-buildroot/sources/openwrt-wrt54g-router.patch create mode 100644 obsolete-buildroot/sources/openwrt-wrt54g-shared.patch create mode 100755 obsolete-buildroot/sources/patch-kernel.sh create mode 100644 obsolete-buildroot/sources/pcmcia.patch create mode 100644 obsolete-buildroot/sources/perl-cross-0.1.tar.gz create mode 100644 obsolete-buildroot/sources/perl.patch create mode 100755 obsolete-buildroot/sources/sedcheck.sh create mode 100644 obsolete-buildroot/sources/skel.tar.gz create mode 100644 obsolete-buildroot/sources/specs-arm-soft-float create mode 100644 obsolete-buildroot/sources/specs-mips-soft-float create mode 100644 obsolete-buildroot/sources/specs-mipsel-soft-float create mode 100644 obsolete-buildroot/sources/specs-powerpc-soft-float create mode 100644 obsolete-buildroot/sources/squashfs.patch create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/TZ create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/fstab create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/group create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/hostname create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/hosts create mode 100755 obsolete-buildroot/sources/target_skeleton/etc/init.d/S20urandom create mode 100755 obsolete-buildroot/sources/target_skeleton/etc/init.d/S40network create mode 100755 obsolete-buildroot/sources/target_skeleton/etc/init.d/rcS create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/inittab create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/inputrc create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/issue create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/network/interfaces create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/passwd create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/profile create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/protocols create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/random-seed create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/resolv.conf create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/securetty create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/services create mode 100644 obsolete-buildroot/sources/target_skeleton/etc/shadow create mode 100644 obsolete-buildroot/sources/target_skeleton/root/.bash_history create mode 100644 obsolete-buildroot/sources/target_skeleton/root/.bash_logout create mode 100644 obsolete-buildroot/sources/target_skeleton/root/.bash_profile create mode 100644 obsolete-buildroot/sources/target_skeleton/root/.bashrc create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/a/ansi create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/d/dumb create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/l/linux create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/r/rxvt create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/screen create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/screen-w create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/sun create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/v/vt100 create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/v/vt220 create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/v/vt52 create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/x/xterm create mode 100644 obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/x/xterm-xfree86 create mode 100755 obsolete-buildroot/sources/target_skeleton/usr/share/udhcpc/default.script create mode 100644 obsolete-buildroot/sources/tinyx-011010.patch create mode 100644 obsolete-buildroot/sources/uClibc-ldso-0.9.24.patch create mode 100644 obsolete-buildroot/sources/uClibc.config create mode 100644 obsolete-buildroot/sources/uClibc.config-locale create mode 100644 obsolete-buildroot/sources/uClibc.config-openwrt create mode 100644 obsolete-buildroot/sources/util-linux.patch create mode 100644 obsolete-buildroot/sources/valgrind.patch create mode 100644 obsolete-buildroot/sources/vtun.patch create mode 100755 obsolete-buildroot/sources/yacc diff --git a/obsolete-buildroot/.cvsignore b/obsolete-buildroot/.cvsignore new file mode 100644 index 0000000000..08611a0d4d --- /dev/null +++ b/obsolete-buildroot/.cvsignore @@ -0,0 +1,4 @@ +UMlinux +root_fs* +build_* +toolchain_build_* diff --git a/obsolete-buildroot/Makefile b/obsolete-buildroot/Makefile new file mode 100644 index 0000000000..96fa2494a8 --- /dev/null +++ b/obsolete-buildroot/Makefile @@ -0,0 +1,370 @@ +# Makefile for a simple busybox/uClibc root filesystem +# +# Copyright (C) 2001-2004 Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + + +############################################################# +# +# EDIT this stuff to suit your system and preferences +# +# Use := when possible to get precomputation, thereby +# speeding up the build process. +# +############################################################# + +# What sortof target system shall we compile this for? +#ARCH:=i386 +#ARCH:=arm +#ARCH:=mips +ARCH:=mipsel +#ARCH:=powerpc +#ARCH:=sh4 +# Busybox link failing due to needing libgcc functions that are statics. +#ARCH:=cris + +# The following currently fail to build since no shared lib support. +#ARCH:=sh64 +#ARCH:=m68k +#ARCH:=v850 +#ARCH:=sparc +#ARCH:=whatever + +# If you are building a native gcc toolchain, do you want to +# build the old gcc-2.95 based toolchain, or would you prefer +# a nice and shiny new gcc-3.3.2 toolchain? +# WARNING -- 2.95 currently only builds for i386, arm, mips*, and powerpc. +# WARNING -- 2.95 does not currently build natively for the target. +GCC_2_95_TOOLCHAIN:=false + +# Enable this to use the uClibc daily snapshot instead of a released +# version. Daily snapshots may contain new features and bugfixes. Or +# they may not even compile at all, depending on what Erik is doing... +#USE_UCLIBC_SNAPSHOT:= +#USE_UCLIBC_SNAPSHOT:=snapshot +USE_UCLIBC_SNAPSHOT:=20040509 + +# Temporary option... Fall back to (slightly modified) ldso 0.9.24 code? +# This is here temporarily since I'm having problems with the current +# cvs ldso code on mipsel. +USE_UCLIBC_LDSO_0_9_24:=true +#USE_UCLIBC_LDSO_0_9_24:=false + +# Enable this to use the busybox daily snapshot instead of a released +# version. Daily snapshots may contain new features and bugfixes. Or +# they may not even compile at all.... +#USE_BUSYBOX_SNAPSHOT:= +#USE_BUSYBOX_SNAPSHOT:=snapshot +USE_BUSYBOX_SNAPSHOT:=20040509 + +# Enable large file (files > 2 GB) support +BUILD_WITH_LARGEFILE:=true + +# Command used to download source code +WGET:=wget --passive-ftp + +# Optimize toolchain for which type of CPU? +OPTIMIZE_FOR_CPU=$(ARCH) +#OPTIMIZE_FOR_CPU=i686 +# Note... gcc 2.95 does not seem to like anything higher than i586. +#OPTIMIZE_FOR_CPU=i586 +#OPTIMIZE_FOR_CPU=whatever + +# Soft floating point options. +# Notes: +# Currently builds with gcc 3.3 for arm, mips, mipsel, powerpc. +# (i386 support will be added back in at some point.) +# Only tested with multilib enabled. +# For i386, long double is the same as double (64 bits). While this +# is unusual for x86, it seemed the best approach considering the +# limitations in the gcc floating point emulation library. +# For arm, soft float uses the usual libfloat routines. +# Custom specs files are used to set the default gcc mode to soft float +# as a convenience, since you shouldn't link hard and soft float +# together. In fact, arm won't even let you. +# (Un)comment the appropriate line below. +#SOFT_FLOAT:=true +SOFT_FLOAT:=false + +TARGET_OPTIMIZATION=-Os -mips2 +TARGET_DEBUGGING= #-g + +# Currently the unwind stuff seems to work for staticly linked apps but +# not dynamic. So use setjmp/longjmp exceptions by default. +GCC_USE_SJLJ_EXCEPTIONS:=--enable-sjlj-exceptions +#GCC_USE_SJLJ_EXCEPTIONS:= + +# Any additional gcc options you may want to include.... +EXTRA_GCC_CONFIG_OPTIONS:= + +# Enable the following if you want locale/gettext/i18n support. +# NOTE! Currently the pregnerated locale stuff only works for x86! +#ENABLE_LOCALE:=true +ENABLE_LOCALE:=false + +# If you want multilib enabled, enable this... +MULTILIB:=--enable-multilib + +# Build/install c++ compiler and libstdc++? +#INSTALL_LIBSTDCPP:=true +INSTALL_LIBSTDCPP:=false + +# Build/install java compiler and libgcj? (requires c++) +# WARNING!!! DOES NOT BUILD FOR TARGET WITHOUT INTERVENTION!!! mjn3 +#INSTALL_LIBGCJ:=true +INSTALL_LIBGCJ:=false + +# For SMP machines some stuff can be run in parallel +#JLEVEL=-j3 + +############################################################# +# +# The list of stuff to build for the target filesystem +# +############################################################# +TARGETS:=host-sed + +ifeq ($(GCC_2_95_TOOLCHAIN),true) +TARGETS+=uclibc-configured binutils gcc2_95 +else +TARGETS+=uclibc-configured binutils gcc3_3 +endif + +# Do you want user mode Linux (x86 only), or are you building a +# your own kernel that will run on its own? Perhaps you have a +# kernel you have already configured and you want to use that? +# The default is to just use a set of known working kernel +# headers. Unless you want to build a kernel, I recommend just +# using that... +#TARGETS+=kernel-headers +#TARGETS+=linux +#TARGETS+=user-mode-linux +#TARGETS+=system-linux +TARGETS+= openwrt-base + +# The default minimal set +#TARGETS+=busybox tinylogin + +# Openssh... +#TARGETS+=zlib openssl openssh +# Dropbear sshd is much smaller than openssl + openssh +#TARGETS+=dropbear_sshd + +# Everything needed to build a full uClibc development system! +#TARGETS+=coreutils findutils bash make diffutils patch sed +#TARGETS+=ed flex bison file gawk tar grep bzip2 + +#If you want a development system, you probably want gcc built +# with uClibc so it can run within your dev system... +#TARGETS+=gcc2_95_target ccache_target # NOT WORKING!!! +#TARGETS+=gcc3_3_target ccache_target + +# Of course, if you are installing a development system, you +# may want some header files so you can compile stuff.... +#TARGETS+=ncurses-headers zlib-headers openssl-headers + +# More development system stuff for those that want it +#TARGETS+=m4 autoconf automake libtool + +# Perl +#TARGETS+=perl + +# Some nice debugging tools +#TARGETS+=gdb strace ltrace + +# The Valgrind debugger (x86 only) +#TARGETS+=valgrind + +# Some stuff for access points and firewalls +#TARGETS+=iptables hostap wtools dhcp_relay bridge +#TARGETS+=iproute2 netsnmp + +# Run customize.mk at the very end to add your own special config. +# This is useful for making your own distro within the buildroot +# process. +# TARGETS+=customize + +############################################################# +# +# Pick your root filesystem type. +# +############################################################# +#TARGETS+=ext2root + +# Must mount cramfs with 'ramdisk_blocksize=4096' +#TARGETS+=cramfsroot + +# You may need to edit make/jffs2root.mk to change target +# endian-ness or similar, but this is sufficient for most +# things as-is... +#TARGETS+=jffs2root + +#TARGETS+= openwrt-linux.trx +TARGETS+= openwrt-code.bin + +############################################################# +# +# You should probably leave this stuff alone unless you know +# what you are doing. +# +############################################################# + +ifeq ($(SOFT_FLOAT),true) +SOFT_FLOAT_CONFIG_OPTION:=--without-float +TARGET_SOFT_FLOAT:=-msoft-float +ARCH_FPU_SUFFIX:=_nofpu +else +SOFT_FLOAT_CONFIG_OPTION:= +TARGET_SOFT_FLOAT:= +ARCH_FPU_SUFFIX:= +endif + +ifeq ($(INSTALL_LIBGCJ),true) +INSTALL_LIBSTDCPP:=true +endif + +# WARNING -- uClibc currently disables large file support on cris. +ifeq ("$(strip $(ARCH))","cris") +BUILD_WITH_LARGEFILE:=false +endif + +ifneq ($(BUILD_WITH_LARGEFILE),true) +DISABLE_LARGEFILE= --disable-largefile +endif +TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) + +HOSTCC:=gcc +BASE_DIR:=${shell pwd} +SOURCE_DIR:=$(BASE_DIR)/sources +DL_DIR:=$(SOURCE_DIR)/dl +PATCH_DIR=$(SOURCE_DIR)/patches +BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX) +TARGET_DIR:=$(BUILD_DIR)/root +STAGING_DIR=$(BUILD_DIR)/staging_dir +TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX) +TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin +IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX) +REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc +GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux +KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CC=$(TARGET_CROSS)gcc +STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note + + +HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \ + -e 's/sparc.*/sparc/' \ + -e 's/arm.*/arm/g' \ + -e 's/m68k.*/m68k/' \ + -e 's/ppc/powerpc/g' \ + -e 's/v850.*/v850/g' \ + -e 's/sh[234]/sh/' \ + -e 's/mips-.*/mips/' \ + -e 's/mipsel-.*/mipsel/' \ + -e 's/cris.*/cris/' \ + -e 's/i[3-9]86/i386/' \ + ) +GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu +TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \ + AR=$(TARGET_CROSS)ar \ + AS=$(TARGET_CROSS)as \ + LD=$(TARGET_CROSS)ld \ + NM=$(TARGET_CROSS)nm \ + CC=$(TARGET_CROSS)gcc \ + GCC=$(TARGET_CROSS)gcc \ + CXX=$(TARGET_CROSS)g++ \ + RANLIB=$(TARGET_CROSS)ranlib + +ifeq ($(ENABLE_LOCALE),true) +DISABLE_NLS:= +else +DISABLE_NLS:=--disable-nls +endif + + +all: world + +TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS)) +TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS)) +TARGETS_DIRCLEAN:=$(patsubst %,%-dirclean,$(TARGETS)) + +world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS) + @echo "ALL DONE." + +.PHONY: all world clean dirclean distclean source $(TARGETS) \ + $(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) + +include make/*.mk + +############################################################# +# +# staging and target directories do NOT list these as +# dependancies anywhere else +# +############################################################# +$(DL_DIR): + mkdir $(DL_DIR) + +$(BUILD_DIR): + mkdir $(BUILD_DIR) + +$(STAGING_DIR): + rm -rf $(STAGING_DIR) + mkdir -p $(STAGING_DIR)/lib + mkdir -p $(STAGING_DIR)/usr + ln -fs $(REAL_GNU_TARGET_NAME)/include $(STAGING_DIR)/include + ln -fs ../lib $(STAGING_DIR)/usr/lib + ln -fs ../$(REAL_GNU_TARGET_NAME)/include $(STAGING_DIR)/usr/include + + +$(TARGET_DIR): $(DL_DIR)/$(OPENWRT_ROOT_SKEL) + rm -rf $(TARGET_DIR) + #zcat $(SOURCE_DIR)/skel.tar.gz | tar -C $(BUILD_DIR) -xf - + zcat $(DL_DIR)/$(OPENWRT_ROOT_SKEL) | tar -C $(BUILD_DIR) -xf - + #cp -a $(SOURCE_DIR)/target_skeleton/* $(TARGET_DIR)/ + -find $(TARGET_DIR) -type d -name CVS -exec rm -rf {} \; > /dev/null 2>&1 + +source: $(TARGETS_SOURCE) + +############################################################# +# +# Cleanup and misc junk +# +############################################################# +clean: + rm -rf $(TOOL_BUILD_DIR) $(BUILD_DIR) $(IMAGE) \ + openwrt-linux.trx openwrt-g-code.bin openwrt-gs-code.bin \ + openwrt-kmodules.tar.bz2 + +dirclean: $(TARGETS_DIRCLEAN) + rm -rf $(TARGET_DIR) $(STAGING_DIR) $(IMAGE) \ + openwrt-linux.trx openwrt-g-code.bin openwrt-gs-code.bin \ + openwrt-kmodules.tar.bz2 + +distclean: + rm -rf $(DL_DIR) $(BUILD_DIR) $(LINUX_KERNEL) $(IMAGE) \ + openwrt-linux.trx openwrt-g-code.bin openwrt-gs-code.bin \ + openwrt-kmodules.tar.bz2 + +sourceball: + rm -rf $(BUILD_DIR) + set -e; \ + cd ..; \ + rm -f buildroot.tar.bz2; \ + tar -cvf buildroot.tar buildroot; \ + bzip2 -9 buildroot.tar; \ diff --git a/obsolete-buildroot/README b/obsolete-buildroot/README new file mode 100644 index 0000000000..3b5b771af4 --- /dev/null +++ b/obsolete-buildroot/README @@ -0,0 +1,42 @@ +This is a modified uClibc buildroot, customized to build OpenWRT. +NOTE! This tarball is meant to be unpacked on top of a stock uClibc +buildroot directory as it only include the necessary customizations! + +If you already have the linksys tarball (check make/openwrt.mk for the +version used), then move/copy/symlink it into sources/dl. At the +moment (2004/03/05) I'm using wrt54gv2.2.02.2.tgz. + +Simply running 'make' will build openwrt-code.bin and a tarball of +the kernel modules. Customizations of the kernel, uClibc, and busybox +are possible by modifying the appropriate config files in source. +Copies of the stock openwrt Makefile, uClibc.config, busybox.config, +are included with a '-openwrt' suffix. + +Remember that different configurations of uClibc may not be binary +compatible. Also, uClibc is not necessarily binary compatible between +versions. In particular, dynamicly linked applications and libraries +built with the linksys/broadcom toolchain are NOT binary compatible +with current uClibc. + +Manuel Novoa III +mjn3@codepoet.org + + +2004/03/16 Added patch to support boardtype of bcm94710ap. + Updated resetmon patch as per mbm. + Set busybox and uClibc snapshots to known good versions. + +2004/03/30 Switch to wrt54gs.2.07.1.tgz as the base tarball. + Start grabbing the (updated) root skeleton from openwrt cvs. + Add busybox applets: passwd and nameif. + Update snapshots of buildroot, uClibc, and busybox. + Fix broken /var symlink. + +2004/03/31 Replace diag_led.c with mbm's rewrite. + Create code.bin files for both 'G' and 'GS' units. + Update busybox for sed fix. + +2004/05/08 Add busybox applets: chown, chgrp, lsmod, sysctl + Remove: ipaddr, iplink, iproute + Update snapshots of buildroot, uClibc, busybox, netfilter. + diff --git a/obsolete-buildroot/make/autoconf.mk b/obsolete-buildroot/make/autoconf.mk new file mode 100644 index 0000000000..8343160ae1 --- /dev/null +++ b/obsolete-buildroot/make/autoconf.mk @@ -0,0 +1,72 @@ +############################################################# +# +# autoconf +# +############################################################# +AUTOCONF_SOURCE:=autoconf-2.57.tar.bz2 +AUTOCONF_SITE:=ftp://ftp.gnu.org/gnu/autoconf +AUTOCONF_CAT:=bzcat +AUTOCONF_DIR:=$(BUILD_DIR)/autoconf-2.57 +AUTOCONF_BINARY:=autoconf +AUTOCONF_TARGET_BINARY:=usr/bin/autoconf + +$(DL_DIR)/$(AUTOCONF_SOURCE): + $(WGET) -P $(DL_DIR) $(AUTOCONF_SITE)/$(AUTOCONF_SOURCE) + +autoconf-source: $(DL_DIR)/$(AUTOCONF_SOURCE) + +$(AUTOCONF_DIR)/.unpacked: $(DL_DIR)/$(AUTOCONF_SOURCE) + $(AUTOCONF_CAT) $(DL_DIR)/$(AUTOCONF_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(AUTOCONF_DIR)/.unpacked + +$(AUTOCONF_DIR)/.configured: $(AUTOCONF_DIR)/.unpacked + (cd $(AUTOCONF_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) EMACS="no" \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + ); + touch $(AUTOCONF_DIR)/.configured + +$(AUTOCONF_DIR)/bin/$(AUTOCONF_BINARY): $(AUTOCONF_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(AUTOCONF_DIR) + +$(TARGET_DIR)/$(AUTOCONF_TARGET_BINARY): $(AUTOCONF_DIR)/bin/$(AUTOCONF_BINARY) + $(MAKE) \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + bindir=$(TARGET_DIR)/usr/bin \ + sbindir=$(TARGET_DIR)/usr/sbin \ + libexecdir=$(TARGET_DIR)/usr/lib \ + datadir=$(TARGET_DIR)/usr/share \ + sysconfdir=$(TARGET_DIR)/etc \ + localstatedir=$(TARGET_DIR)/var \ + libdir=$(TARGET_DIR)/usr/lib \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(TARGET_DIR)/usr/include \ + -C $(AUTOCONF_DIR) install; + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +autoconf: uclibc $(TARGET_DIR)/$(AUTOCONF_TARGET_BINARY) + +autoconf-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(AUTOCONF_DIR) uninstall + -$(MAKE) -C $(AUTOCONF_DIR) clean + +autoconf-dirclean: + rm -rf $(AUTOCONF_DIR) + diff --git a/obsolete-buildroot/make/automake.mk b/obsolete-buildroot/make/automake.mk new file mode 100644 index 0000000000..6ac66003ac --- /dev/null +++ b/obsolete-buildroot/make/automake.mk @@ -0,0 +1,74 @@ +############################################################# +# +# automake +# +############################################################# +AUTOMAKE_SOURCE:=automake-1.6.3.tar.bz2 +AUTOMAKE_SITE:=ftp://ftp.gnu.org/gnu/automake +AUTOMAKE_CAT:=bzcat +AUTOMAKE_DIR:=$(BUILD_DIR)/automake-1.6.3 +AUTOMAKE_BINARY:=automake +AUTOMAKE_TARGET_BINARY:=usr/bin/automake + +$(DL_DIR)/$(AUTOMAKE_SOURCE): + $(WGET) -P $(DL_DIR) $(AUTOMAKE_SITE)/$(AUTOMAKE_SOURCE) + +automake-source: $(DL_DIR)/$(AUTOMAKE_SOURCE) + +$(AUTOMAKE_DIR)/.unpacked: $(DL_DIR)/$(AUTOMAKE_SOURCE) + $(AUTOMAKE_CAT) $(DL_DIR)/$(AUTOMAKE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(AUTOMAKE_DIR)/.unpacked + +$(AUTOMAKE_DIR)/.configured: $(AUTOMAKE_DIR)/.unpacked + (cd $(AUTOMAKE_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + ); + touch $(AUTOMAKE_DIR)/.configured + +$(AUTOMAKE_DIR)/$(AUTOMAKE_BINARY): $(AUTOMAKE_DIR)/.configured + $(MAKE) -C $(AUTOMAKE_DIR) + touch -c $(AUTOMAKE_DIR)/$(AUTOMAKE_BINARY) + +$(TARGET_DIR)/$(AUTOMAKE_TARGET_BINARY): $(AUTOMAKE_DIR)/$(AUTOMAKE_BINARY) + $(MAKE) \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + bindir=$(TARGET_DIR)/usr/bin \ + sbindir=$(TARGET_DIR)/usr/sbin \ + libexecdir=$(TARGET_DIR)/usr/lib \ + datadir=$(TARGET_DIR)/usr/share \ + sysconfdir=$(TARGET_DIR)/etc \ + localstatedir=$(TARGET_DIR)/var \ + libdir=$(TARGET_DIR)/usr/lib \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(TARGET_DIR)/usr/include \ + -C $(AUTOMAKE_DIR) install; + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + touch -c $(TARGET_DIR)/$(AUTOMAKE_TARGET_BINARY) + +automake: uclibc $(TARGET_DIR)/$(AUTOMAKE_TARGET_BINARY) + +automake-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(AUTOMAKE_DIR) uninstall + -$(MAKE) -C $(AUTOMAKE_DIR) clean + +automake-dirclean: + rm -rf $(AUTOMAKE_DIR) + diff --git a/obsolete-buildroot/make/bash.mk b/obsolete-buildroot/make/bash.mk new file mode 100644 index 0000000000..26c408fc9d --- /dev/null +++ b/obsolete-buildroot/make/bash.mk @@ -0,0 +1,71 @@ +############################################################# +# +# bash +# +############################################################# +BASH_SOURCE:=bash-2.05b.tar.gz +BASH_SITE:=ftp://ftp.gnu.org/gnu/bash +BASH_CAT:=zcat +BASH_DIR:=$(BUILD_DIR)/bash-2.05b +BASH_BINARY:=bash +BASH_TARGET_BINARY:=bin/bash + +$(DL_DIR)/$(BASH_SOURCE): + $(WGET) -P $(DL_DIR) $(BASH_SITE)/$(BASH_SOURCE) + +bash-source: $(DL_DIR)/$(BASH_SOURCE) + +$(BASH_DIR)/.unpacked: $(DL_DIR)/$(BASH_SOURCE) + $(BASH_CAT) $(DL_DIR)/$(BASH_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # This is broken when -lintl is added to LIBS + $(SED) 's,LIBS_FOR_BUILD =.*,LIBS_FOR_BUILD =,g' \ + $(BASH_DIR)/builtins/Makefile.in + touch $(BASH_DIR)/.unpacked + +$(BASH_DIR)/.configured: $(BASH_DIR)/.unpacked + (cd $(BASH_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) CC_FOR_BUILD=$(HOSTCC) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ac_cv_func_setvbuf_reversed=no \ + bash_cv_have_mbstate_t=yes \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + --with-curses \ + --enable-alias \ + ); + touch $(BASH_DIR)/.configured + +$(BASH_DIR)/$(BASH_BINARY): $(BASH_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) CC_FOR_BUILD=$(HOSTCC) -C $(BASH_DIR) + +$(TARGET_DIR)/$(BASH_TARGET_BINARY): $(BASH_DIR)/$(BASH_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BASH_DIR) install + rm -f $(TARGET_DIR)/bin/bash* + mv $(TARGET_DIR)/usr/bin/bash* $(TARGET_DIR)/bin/ + (cd $(TARGET_DIR)/bin; ln -fs bash sh) + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +bash: ncurses uclibc $(TARGET_DIR)/$(BASH_TARGET_BINARY) + +bash-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BASH_DIR) uninstall + -$(MAKE) -C $(BASH_DIR) clean + +bash-dirclean: + rm -rf $(BASH_DIR) + diff --git a/obsolete-buildroot/make/berkeleydb.mk b/obsolete-buildroot/make/berkeleydb.mk new file mode 100644 index 0000000000..5b4105a8e6 --- /dev/null +++ b/obsolete-buildroot/make/berkeleydb.mk @@ -0,0 +1,94 @@ +############################################################# +# +# berkeley db +# +############################################################# +DB_SITE:=http://www.sleepycat.com/update/snapshot +DB_SOURCE:=db-4.1.25.NC.tar.gz +DB_DIR:=$(BUILD_DIR)/db-4.1.25.NC + + +$(DL_DIR)/$(DB_SOURCE): + $(WGET) -P $(DL_DIR) $(DB_SITE)/$(DB_SOURCE) + +berkeleydb-source: $(DL_DIR)/$(DB_SOURCE) + +$(DB_DIR)/.dist: $(DL_DIR)/$(DB_SOURCE) + zcat $(DL_DIR)/$(DB_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(DB_DIR)/.dist + +$(DB_DIR)/.configured: $(DB_DIR)/.dist + (cd $(DB_DIR)/build_unix; rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ../dist/configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --with-gnu-ld \ + --enable-shared \ + --disable-cxx \ + --disable-java \ + --disable-rpc \ + --disable-tcl \ + --disable-compat185 \ + --with-pic \ + ); + $(SED) 's/\.lo/.o/g' $(DB_DIR)/build_unix/Makefile + touch $(DB_DIR)/.configured + +$(DB_DIR)/build_unix/.libs/libdb-4.1.so: $(DB_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(DB_DIR)/build_unix + +$(STAGING_DIR)/lib/libdb-4.1.so: $(DB_DIR)/build_unix/.libs/libdb-4.1.so + $(MAKE) \ + prefix=$(STAGING_DIR) \ + exec_prefix=$(STAGING_DIR) \ + bindir=$(STAGING_DIR)/bin \ + sbindir=$(STAGING_DIR)/sbin \ + libexecdir=$(STAGING_DIR)/lib \ + datadir=$(STAGING_DIR)/share \ + sysconfdir=$(STAGING_DIR)/etc \ + localstatedir=$(STAGING_DIR)/var \ + libdir=$(STAGING_DIR)/lib \ + infodir=$(STAGING_DIR)/info \ + mandir=$(STAGING_DIR)/man \ + includedir=$(STAGING_DIR)/include \ + -C $(DB_DIR)/build_unix install; + chmod a-x $(STAGING_DIR)/lib/libdb*so* + rm -f $(STAGING_DIR)/bin/db_* + rm -rf $(STAGING_DIR)/share/locale $(STAGING_DIR)/info \ + $(STAGING_DIR)/man $(STAGING_DIR)/share/doc + +$(TARGET_DIR)/lib/libdb-4.1.so: $(STAGING_DIR)/lib/libdb-4.1.so + rm -rf $(TARGET_DIR)/lib/libdb* + cp -a $(STAGING_DIR)/lib/libdb*so* $(TARGET_DIR)/lib/ + rm -f $(TARGET_DIR)/lib/libdb.so $(TARGET_DIR)/lib/libdb.la $(TARGET_DIR)/lib/libdb.a + (cd $(TARGET_DIR)/usr/lib; ln -fs /lib/libdb-4.1.so libdb.so) + -$(STRIP) --strip-unneeded $(TARGET_DIR)/lib/libdb*so* + +$(TARGET_DIR)/usr/lib/libdb.a: $(STAGING_DIR)/lib/libdb-4.1.a + cp -dpf $(STAGING_DIR)/include/db.h $(TARGET_DIR)/usr/include/ + cp -dpf $(STAGING_DIR)/lib/libdb*.a $(TARGET_DIR)/usr/lib/ + cp -dpf $(STAGING_DIR)/lib/libdb*.la $(TARGET_DIR)/usr/lib/ + touch -c $(TARGET_DIR)/usr/lib/libdb.a + +berkeleydb-headers: $(TARGET_DIR)/usr/lib/libdb.a + +berkeleydb-clean: + $(MAKE) -C $(DB_DIR)/build_unix clean + +berkeleydb-dirclean: + rm -rf $(DB_DIR) + +berkeleydb: uclibc $(TARGET_DIR)/lib/libdb-4.1.so + diff --git a/obsolete-buildroot/make/binutils-uclibc.mk b/obsolete-buildroot/make/binutils-uclibc.mk new file mode 100644 index 0000000000..ae2e5284be --- /dev/null +++ b/obsolete-buildroot/make/binutils-uclibc.mk @@ -0,0 +1,120 @@ +############################################################# +# +# build binutils for use on the host system +# +############################################################# +BINUTILS_SITE:=http://ftp.kernel.org/pub/linux/devel/binutils +BINUTILS_SOURCE:=binutils-2.14.90.0.7.tar.bz2 +BINUTILS_DIR:=$(TOOL_BUILD_DIR)/binutils-2.14.90.0.7 +BINUTILS_CAT:=bzcat + +BINUTILS_DIR1:=$(TOOL_BUILD_DIR)/binutils-build + +$(DL_DIR)/$(BINUTILS_SOURCE): + $(WGET) -P $(DL_DIR) $(BINUTILS_SITE)/$(BINUTILS_SOURCE) + +$(BINUTILS_DIR)/.unpacked: $(DL_DIR)/$(BINUTILS_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + mkdir -p $(DL_DIR) + $(BINUTILS_CAT) $(DL_DIR)/$(BINUTILS_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - + touch $(BINUTILS_DIR)/.unpacked + +$(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked + # Apply any files named binutils-*.patch from the source directory to binutils + $(SOURCE_DIR)/patch-kernel.sh $(BINUTILS_DIR) $(SOURCE_DIR) binutils-uclibc*.patch + touch $(BINUTILS_DIR)/.patched + +$(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched + mkdir -p $(BINUTILS_DIR1) + (cd $(BINUTILS_DIR1); \ + $(BINUTILS_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) ); + touch $(BINUTILS_DIR1)/.configured + +$(BINUTILS_DIR1)/binutils/objdump: $(BINUTILS_DIR1)/.configured + $(MAKE) $(JLEVEL) -C $(BINUTILS_DIR1) all + +# Make install will put gettext data in staging_dir/share/locale. +# Unfortunatey, it isn't configureable. +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld: $(BINUTILS_DIR1)/binutils/objdump + $(MAKE) $(JLEVEL) -C $(BINUTILS_DIR1) install + +binutils-dependancies: + @if [ ! -x /usr/bin/bison ] ; then \ + echo -e "\n\nYou must install 'bison' on your build machine\n"; \ + exit 1; \ + fi; + @if [ ! -x /usr/bin/flex ] ; then \ + echo -e "\n\nYou must install 'flex' on your build machine\n"; \ + exit 1; \ + fi; + @if [ ! -x /usr/bin/msgfmt ] ; then \ + echo -e "\n\nYou must install 'gettext' on your build machine\n"; \ + exit 1; \ + fi; + +binutils: binutils-dependancies $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld + +binutils-source: $(DL_DIR)/$(BINUTILS_SOURCE) + +binutils-clean: + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + -$(MAKE) -C $(BINUTILS_DIR1) clean + +binutils-dirclean: + rm -rf $(BINUTILS_DIR1) + + + +############################################################# +# +# build binutils for use on the target system +# +############################################################# +BINUTILS_DIR2:=$(BUILD_DIR)/binutils-target +$(BINUTILS_DIR2)/.configured: $(BINUTILS_DIR)/.patched + mkdir -p $(BINUTILS_DIR2) + (cd $(BINUTILS_DIR2); \ + PATH=$(TARGET_PATH) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CFLAGS_FOR_BUILD="-O2 -g" \ + $(BINUTILS_DIR)/configure \ + --prefix=/usr \ + --exec-prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) ); + touch $(BINUTILS_DIR2)/.configured + +$(BINUTILS_DIR2)/binutils/objdump: $(BINUTILS_DIR2)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(JLEVEL) -C $(BINUTILS_DIR2) all + +$(TARGET_DIR)/usr/bin/ld: $(BINUTILS_DIR2)/binutils/objdump + PATH=$(TARGET_PATH) \ + $(MAKE) $(JLEVEL) DESTDIR=$(TARGET_DIR) \ + tooldir=/usr build_tooldir=/usr \ + -C $(BINUTILS_DIR2) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + -$(STRIP) $(TARGET_DIR)/usr/$(REAL_GNU_TARGET_NAME)/bin/* > /dev/null 2>&1 + -$(STRIP) $(TARGET_DIR)/usr/bin/* > /dev/null 2>&1 + +binutils_target: $(GCC_DEPENDANCY) $(TARGET_DIR)/usr/bin/ld + +binutils_target-clean: + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + -$(MAKE) -C $(BINUTILS_DIR2) clean + +binutils_target-dirclean: + rm -rf $(BINUTILS_DIR2) + diff --git a/obsolete-buildroot/make/bison.mk b/obsolete-buildroot/make/bison.mk new file mode 100644 index 0000000000..89c9b916cc --- /dev/null +++ b/obsolete-buildroot/make/bison.mk @@ -0,0 +1,62 @@ +############################################################# +# +# bison +# +############################################################# +BISON_SOURCE:=bison-1.35.tar.bz2 +BISON_SITE:=ftp://ftp.gnu.org/gnu/bison +BISON_DIR:=$(BUILD_DIR)/bison-1.35 +BISON_CAT:=bzcat +BISON_BINARY:=src/bison +BISON_TARGET_BINARY:=usr/bin/bison + +$(DL_DIR)/$(BISON_SOURCE): + $(WGET) -P $(DL_DIR) $(BISON_SITE)/$(BISON_SOURCE) + +bison-source: $(DL_DIR)/$(BISON_SOURCE) + +$(BISON_DIR)/.unpacked: $(DL_DIR)/$(BISON_SOURCE) + $(BISON_CAT) $(DL_DIR)/$(BISON_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(BISON_DIR)/.unpacked + +$(BISON_DIR)/.configured: $(BISON_DIR)/.unpacked + (cd $(BISON_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + gt_cv_func_gnugettext2_libintl=yes \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(BISON_DIR)/.configured + +$(BISON_DIR)/$(BISON_BINARY): $(BISON_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(BISON_DIR) + +$(TARGET_DIR)/$(BISON_TARGET_BINARY): $(BISON_DIR)/$(BISON_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BISON_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + cp -a $(SOURCE_DIR)/yacc $(TARGET_DIR)/usr/bin/yacc + +bison: uclibc $(TARGET_DIR)/$(BISON_TARGET_BINARY) + +bison-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BISON_DIR) uninstall + -$(MAKE) -C $(BISON_DIR) clean + +bison-dirclean: + rm -rf $(BISON_DIR) + diff --git a/obsolete-buildroot/make/boa.mk b/obsolete-buildroot/make/boa.mk new file mode 100644 index 0000000000..1eb233fbc6 --- /dev/null +++ b/obsolete-buildroot/make/boa.mk @@ -0,0 +1,57 @@ +############################################################# +# +# boa +# +############################################################# + +BOA_VERSION=0.94.14rc4 + +# Don't alter below this line unless you (think) you know +# what you are doing! Danger, Danger! + +BOA_SOURCE=boa-$(BOA_VERSION).tar.gz +BOA_SITE=http://www.boa.org/ +BOA_DIR=$(BUILD_DIR)/${shell basename $(BOA_SOURCE) .tar.gz} +BOA_WORKDIR=$(BUILD_DIR)/boa_workdir + +$(DL_DIR)/$(BOA_SOURCE): + $(WGET) -P $(DL_DIR) $(BOA_SITE)/$(BOA_SOURCE) + +$(BOA_DIR)/.unpacked: $(DL_DIR)/$(BOA_SOURCE) + gzip -d -c $(DL_DIR)/$(BOA_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(BOA_DIR)/.unpacked + +$(BOA_WORKDIR)/Makefile: $(BOA_DIR)/.unpacked + rm -f $(BOA_WORKDIR)/Makefile + mkdir -p $(BOA_WORKDIR) + (cd $(BOA_WORKDIR) && CONFIG_SITE=$(SOURCE_DIR)/boa-config.site-$(ARCH) \ + CC=$(TARGET_CC) $(BOA_DIR)/configure) + touch $(BOA_WORKDIR)/.depend + +$(BOA_WORKDIR)/boa $(BOA_WORKDIR)/boa_indexer: $(BOA_WORKDIR)/Makefile + rm -f $@ + $(MAKE) VPATH=$(BOA_DIR)/src/ -C $(BOA_WORKDIR) + +$(BOA_WORKDIR)/.installed: $(BOA_WORKDIR)/boa $(BOA_WORKDIR)/boa_indexer + mkdir -p $(TARGET_DIR)/usr/sbin + cp -f $(BOA_WORKDIR)/src/boa $(TARGET_DIR)/usr/sbin/boa + mkdir -p $(TARGET_DIR)/usr/lib/boa + cp -f $(BOA_WORKDIR)/src/boa_indexer $(TARGET_DIR)/usr/lib/boa/boa_indexer + mkdir -p $(TARGET_DIR)/etc/boa + cp -f $(SOURCE_DIR)/boa.conf $(TARGET_DIR)/etc/boa + cp -f $(SOURCE_DIR)/mime.types $(TARGET_DIR)/etc/mime.types + strip --strip-all $(TARGET_DIR)/usr/sbin/boa $(TARGET_DIR)/usr/lib/boa/boa_indexer + touch $(BOA_WORKDIR)/.installed + +boa: uclibc $(BOA_WORKDIR)/.installed + +boa-source: $(DL_DIR)/$(BOA_SOURCE) + +boa-clean: + @if [ -d $(BOA_WORKDIR)/Makefile ] ; then \ + $(MAKE) -C $(BOA_WORKDIR) clean ; \ + fi; + +boa-dirclean: + rm -rf $(BOA_DIR) $(BOA_WORKDIR) + diff --git a/obsolete-buildroot/make/bridge.mk b/obsolete-buildroot/make/bridge.mk new file mode 100644 index 0000000000..7deb719605 --- /dev/null +++ b/obsolete-buildroot/make/bridge.mk @@ -0,0 +1,62 @@ +############################################################# +# +# bridgeutils - User Space Program For Controling Bridging +# +############################################################# +# +BRIDGE_SOURCE_URL=http://bridge.sourceforge.net/bridge-utils +BRIDGE_SOURCE=bridge-utils-0.9.6.tar.gz +BRIDGE_BUILD_DIR=$(BUILD_DIR)/bridge-utils-0.9.6 +BRIDGE_TARGET_BINARY:=usr/sbin/brctl + +$(DL_DIR)/$(BRIDGE_SOURCE): + $(WGET) -P $(DL_DIR) $(BRIDGE_SOURCE_URL)/$(BRIDGE_SOURCE) + +$(BRIDGE_BUILD_DIR)/.unpacked: $(DL_DIR)/$(BRIDGE_SOURCE) + zcat $(DL_DIR)/$(BRIDGE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + mv -f $(BUILD_DIR)/bridge-utils $(BRIDGE_BUILD_DIR) + patch -p1 -d $(BRIDGE_BUILD_DIR) < $(SOURCE_DIR)/bridge.patch + touch $(BRIDGE_BUILD_DIR)/.unpacked + +$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.unpacked + (cd $(BRIDGE_BUILD_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-linux=$(LINUX_DIR) \ + ); + touch $(BRIDGE_BUILD_DIR)/.configured + +$(BRIDGE_BUILD_DIR)/brctl/brctl: $(BRIDGE_BUILD_DIR)/.configured + $(MAKE) -C $(BRIDGE_BUILD_DIR) + +$(TARGET_DIR)/$(BRIDGE_TARGET_BINARY): $(BRIDGE_BUILD_DIR)/brctl/brctl + cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + $(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + #cp -af $(BRIDGE_BUILD_DIR)/brctl/brctld $(TARGET_DIR)/usr/sbin/ + #$(STRIP) $(TARGET_DIR)/usr/sbin/brctld + +bridge: $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + +bridge-source: $(DL_DIR)/$(BRIDGE_SOURCE) + +bridge-clean: + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BRIDGE_BUILD_DIR) uninstall + -$(MAKE) -C $(BRIDGE_BUILD_DIR) clean + +bridge-dirclean: + rm -rf $(BRIDGE_BUILD_DIR) diff --git a/obsolete-buildroot/make/busybox.mk b/obsolete-buildroot/make/busybox.mk new file mode 100644 index 0000000000..510489de39 --- /dev/null +++ b/obsolete-buildroot/make/busybox.mk @@ -0,0 +1,59 @@ +############################################################# +# +# busybox +# +############################################################# + +ifneq ($(strip $(USE_BUSYBOX_SNAPSHOT)),) +# Be aware that this changes daily.... +BUSYBOX_DIR:=$(BUILD_DIR)/busybox +BUSYBOX_SOURCE:=busybox-$(strip $(USE_BUSYBOX_SNAPSHOT)).tar.bz2 +BUSYBOX_SITE:=http://www.busybox.net/downloads/snapshots +else +BUSYBOX_DIR:=$(BUILD_DIR)/busybox-1.00-pre8 +BUSYBOX_SOURCE:=busybox-1.00-pre8.tar.bz2 +BUSYBOX_SITE:=http://www.busybox.net/downloads +endif +BUSYBOX_UNZIP=bzcat +BUSYBOX_CONFIG:=$(SOURCE_DIR)/busybox.config + +$(DL_DIR)/$(BUSYBOX_SOURCE): + $(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE) + +busybox-source: $(DL_DIR)/$(BUSYBOX_SOURCE) $(BUSYBOX_CONFIG) + +$(BUSYBOX_DIR)/.configured: $(DL_DIR)/$(BUSYBOX_SOURCE) $(BUSYBOX_CONFIG) + $(BUSYBOX_UNZIP) $(DL_DIR)/$(BUSYBOX_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # Allow busybox patches. + $(SOURCE_DIR)/patch-kernel.sh $(BUSYBOX_DIR) $(SOURCE_DIR) busybox-*.patch + cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config + $(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\ + PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) + $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config +else + $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config +endif + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_DIR) oldconfig + touch $(BUSYBOX_DIR)/.configured + +busybox-unpack: $(BUSYBOX_DIR)/.configured + +$(BUSYBOX_DIR)/busybox: $(BUSYBOX_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \ + EXTRA_CFLAGS="$(TARGET_CFLAGS) -fomit-frame-pointer" -C $(BUSYBOX_DIR) + +$(TARGET_DIR)/bin/busybox: $(BUSYBOX_DIR)/busybox + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \ + EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) install + # Just in case + -chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script + +busybox: uclibc $(TARGET_DIR)/bin/busybox + +busybox-clean: + rm -f $(TARGET_DIR)/bin/busybox + -$(MAKE) -C $(BUSYBOX_DIR) clean + +busybox-dirclean: + rm -rf $(BUSYBOX_DIR) diff --git a/obsolete-buildroot/make/bzip2.mk b/obsolete-buildroot/make/bzip2.mk new file mode 100644 index 0000000000..299105a911 --- /dev/null +++ b/obsolete-buildroot/make/bzip2.mk @@ -0,0 +1,86 @@ +############################################################# +# +# bzip2 +# +############################################################# +BZIP2_SOURCE:=bzip2-1.0.2.tar.gz +BZIP2_SITE:=ftp://sources.redhat.com/pub/bzip2/v102 +BZIP2_DIR:=$(BUILD_DIR)/bzip2-1.0.2 +BZIP2_CAT:=zcat +BZIP2_BINARY:=$(BZIP2_DIR)/bzip2 +BZIP2_TARGET_BINARY:=$(TARGET_DIR)/usr/bin/bzmore + +$(DL_DIR)/$(BZIP2_SOURCE): + $(WGET) -P $(DL_DIR) $(BZIP2_SITE)/$(BZIP2_SOURCE) + +bzip2-source: $(DL_DIR)/$(BZIP2_SOURCE) + +$(BZIP2_DIR)/.unpacked: $(DL_DIR)/$(BZIP2_SOURCE) + $(BZIP2_CAT) $(DL_DIR)/$(BZIP2_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SED) "s,ln \$$(,ln -sf \$$(,g" $(BZIP2_DIR)/Makefile + $(SED) "s,ln -s (lib.*),ln -sf \$$1 ; ln -sf libbz2.so.1.0.2 libbz2.so,g" \ + $(BZIP2_DIR)/Makefile-libbz2_so +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),false) + $(SED) "s,^BIGFILES,#BIGFILES,g" $(BZIP2_DIR)/Makefile + $(SED) "s,^BIGFILES,#BIGFILES,g" $(BZIP2_DIR)/Makefile-libbz2_so +endif + touch $(BZIP2_DIR)/.unpacked + +$(STAGING_DIR)/lib/libbz2.so.1.0.2: $(BZIP2_DIR)/.unpacked + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) CC=$(TARGET_CC) -C $(BZIP2_DIR) -f Makefile-libbz2_so + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) CC=$(TARGET_CC) -C $(BZIP2_DIR) libbz2.a + cp $(BZIP2_DIR)/bzlib.h $(STAGING_DIR)/include/ + cp $(BZIP2_DIR)/libbz2.so.1.0.2 $(STAGING_DIR)/lib/ + cp $(BZIP2_DIR)/libbz2.a $(STAGING_DIR)/lib/ + (cd $(STAGING_DIR)/lib/; ln -sf libbz2.so.1.0.2 libbz2.so) + (cd $(STAGING_DIR)/lib/; ln -sf libbz2.so.1.0.2 libbz2.so.1.0) + +$(BZIP2_BINARY): $(STAGING_DIR)/lib/libbz2.so.1.0.2 + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) CC=$(TARGET_CC) -C $(BZIP2_DIR) bzip2 bzip2recover + +$(BZIP2_TARGET_BINARY): $(BZIP2_BINARY) + (cd $(TARGET_DIR)/usr/bin; \ + rm -f bzip2 bunzip2 bzcat bzip2recover bzgrep bzegrep bzfgrep bzmore bzless bzdiff bzcmp); + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) PREFIX=$(TARGET_DIR)/usr -C $(BZIP2_DIR) install + rm -f $(TARGET_DIR)/usr/lib/libbz2.a + rm -f $(TARGET_DIR)/usr/include/bzlib.h + cp $(BZIP2_DIR)/libbz2.so.1.0.2 $(TARGET_DIR)/usr/lib/ + (cd $(TARGET_DIR)/usr/lib; \ + ln -sf libbz2.so.1.0.2 libbz2.so.1.0; \ + ln -sf libbz2.so.1.0.2 libbz2.so) + (cd $(TARGET_DIR)/usr/bin; \ + ln -sf bzip2 bunzip2; \ + ln -sf bzip2 bzcat; \ + ln -sf bzdiff bzcmp; \ + ln -sf bzmore bzless; \ + ln -sf bzgrep bzegrep; \ + ln -sf bzgrep bzfgrep;) + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +$(TARGET_DIR)/usr/lib/libbz2.a: $(STAGING_DIR)/lib/libbz2.a + mkdir -p $(TARGET_DIR)/usr/include + cp $(STAGING_DIR)/include/bzlib.h $(TARGET_DIR)/usr/include/ + cp $(STAGING_DIR)/lib/libbz2.a $(TARGET_DIR)/usr/lib/ + rm -f $(TARGET_DIR)/lib/libbz2.so + (cd $(TARGET_DIR)/usr/lib; \ + ln -fs /usr/lib/libbz2.so.1.0 libbz2.so; \ + ) + -$(STRIP) --strip-unneeded $(TARGET_DIR)/usr/lib/libbz2.so.1.0 + touch -c $(TARGET_DIR)/usr/lib/libbz2.a + +bzip2-headers: $(TARGET_DIR)/usr/lib/libbz2.a + +bzip2: uclibc $(BZIP2_TARGET_BINARY) + +bzip2-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BZIP2_DIR) uninstall + -$(MAKE) -C $(BZIP2_DIR) clean + +bzip2-dirclean: + rm -rf $(BZIP2_DIR) + diff --git a/obsolete-buildroot/make/ccache.mk b/obsolete-buildroot/make/ccache.mk new file mode 100644 index 0000000000..f973a529e5 --- /dev/null +++ b/obsolete-buildroot/make/ccache.mk @@ -0,0 +1,147 @@ +############################################################# +# +# build ccache to make recompiles faster on the build system +# +############################################################# +CCACHE_SITE:=http://ccache.samba.org/ftp/ccache +CCACHE_SOURCE:=ccache-2.3.tar.gz +CCACHE_DIR1:=$(TOOL_BUILD_DIR)/ccache-2.3 +CCACHE_DIR2:=$(BUILD_DIR)/ccache-2.3 +CCACHE_CAT:=zcat +CCACHE_BINARY:=ccache +CCACHE_TARGET_BINARY:=usr/bin/ccache + +$(DL_DIR)/$(CCACHE_SOURCE): + $(WGET) -P $(DL_DIR) $(CCACHE_SITE)/$(CCACHE_SOURCE) + +$(CCACHE_DIR1)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) + $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - + touch $(CCACHE_DIR1)/.unpacked + +$(CCACHE_DIR1)/.patched: $(CCACHE_DIR1)/.unpacked + $(SED) "s,getenv(\"CCACHE_PATH\"),\"$(STAGING_DIR)/usr/bin\",g" \ + $(CCACHE_DIR1)/execute.c + $(SED) "s,getenv(\"CCACHE_DIR\"),\"$(CCACHE_DIR1)/cache\",g" \ + $(CCACHE_DIR1)/ccache.c + mkdir -p $(CCACHE_DIR1)/cache + touch $(CCACHE_DIR1)/.patched + +$(CCACHE_DIR1)/.configured: $(CCACHE_DIR1)/.patched + mkdir -p $(CCACHE_DIR1) + (cd $(CCACHE_DIR1); rm -rf config.cache; \ + CC=$(HOSTCC) \ + $(CCACHE_DIR1)/configure \ + --target=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + ); + touch $(CCACHE_DIR1)/.configured + +$(CCACHE_DIR1)/$(CCACHE_BINARY): $(CCACHE_DIR1)/.configured + $(MAKE) CC=$(HOSTCC) -C $(CCACHE_DIR1) + +$(STAGING_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR1)/$(CCACHE_BINARY) + mkdir -p $(STAGING_DIR)/usr/bin; + mkdir -p $(TOOL_BUILD_DIR)/.ccache; + cp $(CCACHE_DIR1)/ccache $(STAGING_DIR)/usr/bin + (cd $(STAGING_DIR)/usr/bin; \ + ln -fs $(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc $(OPTIMIZE_FOR_CPU)-linux-gcc; \ + ln -fs $(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc $(OPTIMIZE_FOR_CPU)-linux-cc; \ + ln -fs $(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc $(OPTIMIZE_FOR_CPU)-linux-uclibc-cc); + [ -f $(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc ] && \ + mv $(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc $(STAGING_DIR)/usr/bin/ + (cd $(STAGING_DIR)/bin; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-cc; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-gcc; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-uclibc-cc; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc); +ifeq ($(INSTALL_LIBSTDCPP),true) + [ -f $(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-c++ ] && \ + mv $(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-c++ $(STAGING_DIR)/usr/bin/ + [ -f $(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-g++ ] && \ + mv $(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-g++ $(STAGING_DIR)/usr/bin/ + (cd $(STAGING_DIR)/bin; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-c++; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-g++;\ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-uclibc-c++; \ + ln -fs ../usr/bin/ccache $(OPTIMIZE_FOR_CPU)-linux-uclibc-g++); +endif + +ifeq ($(GCC_2_95_TOOLCHAIN),true) +ccache: gcc2_95 $(STAGING_DIR)/$(CCACHE_TARGET_BINARY) +else +ccache: gcc3_3 $(STAGING_DIR)/$(CCACHE_TARGET_BINARY) +endif + +ccache-clean: + $(MAKE) -C $(CCACHE_DIR1) uninstall + -$(MAKE) -C $(CCACHE_DIR1) clean + +ccache-dirclean: + rm -rf $(CCACHE_DIR1) + + + + +############################################################# +# +# build ccache for use on the target system +# +############################################################# + +$(CCACHE_DIR2)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) + $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(CCACHE_DIR2)/.unpacked + +$(CCACHE_DIR2)/.patched: $(CCACHE_DIR2)/.unpacked + touch $(CCACHE_DIR2)/.patched + +$(CCACHE_DIR2)/.configured: $(CCACHE_DIR2)/.patched + mkdir -p $(CCACHE_DIR2) + (cd $(CCACHE_DIR2); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + $(CCACHE_DIR2)/configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(CCACHE_DIR2)/.configured + +$(CCACHE_DIR2)/$(CCACHE_BINARY): $(CCACHE_DIR2)/.configured + $(MAKE) -C $(CCACHE_DIR2) + +$(TARGET_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR2)/$(CCACHE_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(CCACHE_DIR2) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # put a bunch of symlinks into /bin, since that is earlier + # in the default PATH than /usr/bin where gcc lives + (cd $(TARGET_DIR)/bin; \ + ln -fs /usr/bin/ccache cc; \ + ln -fs /usr/bin/ccache gcc; \ + ln -fs /usr/bin/ccache c++; \ + ln -fs /usr/bin/ccache g++;) + +ccache_target: uclibc $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) + +ccache_target-sources: $(DL_DIR)/$(CCACHE_SOURCE) + +ccache_target-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(CCACHE_DIR2) uninstall + -$(MAKE) -C $(CCACHE_DIR2) clean + +ccache_target-dirclean: + rm -rf $(CCACHE_DIR2) + diff --git a/obsolete-buildroot/make/coreutils.mk b/obsolete-buildroot/make/coreutils.mk new file mode 100644 index 0000000000..825c0f3549 --- /dev/null +++ b/obsolete-buildroot/make/coreutils.mk @@ -0,0 +1,82 @@ +############################################################# +# +# coreutils +# +############################################################# +COREUTILS_SOURCE:=coreutils-5.0.tar.bz2 +COREUTILS_SITE:=ftp://ftp.gnu.org/gnu/coreutils/ +COREUTILS_CAT:=bzcat +COREUTILS_DIR:=$(BUILD_DIR)/coreutils-5.0 +COREUTILS_BINARY:=src/vdir +COREUTILS_TARGET_BINARY:=bin/vdir +BIN_PROGS:=cat chgrp chmod chown cp date dd df dir echo false hostname \ + ln ls mkdir mknod mv pwd rm rmdir vdir sleep stty sync touch true uname + +$(DL_DIR)/$(COREUTILS_SOURCE): + $(WGET) -P $(DL_DIR) $(COREUTILS_SITE)/$(COREUTILS_SOURCE) + +coreutils-source: $(DL_DIR)/$(COREUTILS_SOURCE) + +$(COREUTILS_DIR)/.unpacked: $(DL_DIR)/$(COREUTILS_SOURCE) + $(COREUTILS_CAT) $(DL_DIR)/$(COREUTILS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(COREUTILS_DIR)/.unpacked + +$(COREUTILS_DIR)/.configured: $(COREUTILS_DIR)/.unpacked + (cd $(COREUTILS_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + --disable-rpath \ + --disable-dependency-tracking \ + ); + #Fix up the max number of open files per process, which apparently + # is not set when cross compiling + $(SED) 's,.*UTILS_OPEN_MAX.*,#define UTILS_OPEN_MAX 1019,g' \ + $(COREUTILS_DIR)/config.h + # This is undefined when crosscompiling... + $(SED) 's,.*HAVE_PROC_UPTIME.*,#define HAVE_PROC_UPTIME 1,g' \ + $(COREUTILS_DIR)/config.h + touch $(COREUTILS_DIR)/.configured + +$(COREUTILS_DIR)/$(COREUTILS_BINARY): $(COREUTILS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(COREUTILS_DIR) + rm -f $(TARGET_DIR)/$(COREUTILS_TARGET_BINARY) + +$(TARGET_DIR)/$(COREUTILS_TARGET_BINARY): $(COREUTILS_DIR)/$(COREUTILS_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(COREUTILS_DIR) install + # some things go in root rather than usr + for f in $(BIN_PROGS); do \ + mv $(TARGET_DIR)/usr/bin/$$f $(TARGET_DIR)/bin/$$f; \ + done + # link for archaic shells + ln -fs test $(TARGET_DIR)/usr/bin/[ + # gnu thinks chroot is in bin, debian thinks it's in sbin + mv $(TARGET_DIR)/usr/bin/chroot $(TARGET_DIR)/usr/sbin/chroot + $(STRIP) $(TARGET_DIR)/usr/sbin/chroot > /dev/null 2>&1 + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +coreutils: uclibc $(TARGET_DIR)/$(COREUTILS_TARGET_BINARY) + +coreutils-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(COREUTILS_DIR) uninstall + -$(MAKE) -C $(COREUTILS_DIR) clean + +coreutils-dirclean: + rm -rf $(COREUTILS_DIR) + diff --git a/obsolete-buildroot/make/cramfsroot.mk b/obsolete-buildroot/make/cramfsroot.mk new file mode 100644 index 0000000000..0f1204a258 --- /dev/null +++ b/obsolete-buildroot/make/cramfsroot.mk @@ -0,0 +1,52 @@ +############################################################# +# +# mkcramfs to build to target cramfs filesystems +# +############################################################# +CRAMFS_DIR=$(BUILD_DIR)/cramfs-1.1 +CRAMFS_SOURCE=cramfs-1.1.tar.gz +CRAMFS_SITE=http://aleron.dl.sourceforge.net/sourceforge/cramfs +CRAMFS_PATCH=$(SOURCE_DIR)/cramfs.patch + +$(DL_DIR)/$(CRAMFS_SOURCE): + $(WGET) -P $(DL_DIR) $(CRAMFS_SITE)/$(CRAMFS_SOURCE) + +$(CRAMFS_DIR): $(DL_DIR)/$(CRAMFS_SOURCE) $(CRAMFS_PATCH) + zcat $(DL_DIR)/$(CRAMFS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(CRAMFS_PATCH) | patch -p1 -d $(CRAMFS_DIR) + +$(CRAMFS_DIR)/mkcramfs: $(CRAMFS_DIR) + $(MAKE) CFLAGS="-Wall -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" -C $(CRAMFS_DIR); + touch -c $(CRAMFS_DIR)/mkcramfs + +cramfs: $(CRAMFS_DIR)/mkcramfs + +cramfs-source: $(DL_DIR)/$(CRAMFS_SOURCE) + +cramfs-clean: + -$(MAKE) -C $(CRAMFS_DIR) clean + +cramfs-dirclean: + rm -rf $(CRAMFS_DIR) + +############################################################# +# +# Build the cramfs root filesystem image +# +############################################################# + +cramfsroot: cramfs + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + @rm -rf $(TARGET_DIR)/usr/man + @rm -rf $(TARGET_DIR)/usr/info + $(CRAMFS_DIR)/mkcramfs -q -D $(SOURCE_DIR)/device_table.txt $(TARGET_DIR) $(IMAGE) + +cramfsroot-source: cramfs-source + +cramfsroot-clean: + -$(MAKE) -C $(CRAMFS_DIR) clean + +cramfsroot-dirclean: + rm -rf $(CRAMFS_DIR) + diff --git a/obsolete-buildroot/make/customize.mk b/obsolete-buildroot/make/customize.mk new file mode 100644 index 0000000000..2cfed18345 --- /dev/null +++ b/obsolete-buildroot/make/customize.mk @@ -0,0 +1,10 @@ +############################################################# +# +# Any custom stuff you feel like doing.... +# +############################################################# +CUST_DIR:=$(SOURCE_DIR)/customize +ROOT_DIR:=$(BUILD_DIR)/root + +customize: + cp -af $(CUST_DIR)/* $(ROOT_DIR)/ diff --git a/obsolete-buildroot/make/dhcp_relay.mk b/obsolete-buildroot/make/dhcp_relay.mk new file mode 100644 index 0000000000..8252b4aebd --- /dev/null +++ b/obsolete-buildroot/make/dhcp_relay.mk @@ -0,0 +1,47 @@ +############################################################# +# +# dhcp_relay +# +############################################################# +DHCP_RELAY_SOURCE:=dhcp-3.0pl2.tar.gz +DHCP_RELAY_SITE:=ftp://ftp.isc.org/isc/dhcp +DHCP_RELAY_CAT:=zcat +DHCP_RELAY_DIR:=$(BUILD_DIR)/dhcp-3.0pl2 +DHCP_RELAY_BINARY:=work.linux-2.2/relay/dhcrelay +DHCP_RELAY_TARGET_BINARY:=usr/sbin/dhcrelay +BVARS=PREDEFINES='-D_PATH_DHCPD_DB=\"/var/lib/dhcp/dhcpd.leases\" \ + -D_PATH_DHCLIENT_DB=\"/var/lib/dhcp/dhclient.leases\"' \ + VARDB=/var/lib/dhcp + +$(DL_DIR)/$(DHCP_RELAY_SOURCE): + $(WGET) -P $(DL_DIR) $(DHCP_RELAY_SITE)/$(DHCP_RELAY_SOURCE) + +dhcp_relay-source: $(DL_DIR)/$(DHCP_RELAY_SOURCE) + +$(DHCP_RELAY_DIR)/.unpacked: $(DL_DIR)/$(DHCP_RELAY_SOURCE) + $(DHCP_RELAY_CAT) $(DL_DIR)/$(DHCP_RELAY_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(DHCP_RELAY_DIR)/.unpacked + +$(DHCP_RELAY_DIR)/.configured: $(DHCP_RELAY_DIR)/.unpacked + (cd $(DHCP_RELAY_DIR); $(TARGET_CONFIGURE_OPTS) ./configure ); + touch $(DHCP_RELAY_DIR)/.configured + +$(DHCP_RELAY_DIR)/$(DHCP_RELAY_BINARY): $(DHCP_RELAY_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) $(BVARS) -C $(DHCP_RELAY_DIR) + $(STRIP) $(DHCP_RELAY_DIR)/$(DHCP_RELAY_BINARY) + +$(TARGET_DIR)/$(DHCP_RELAY_TARGET_BINARY): $(DHCP_RELAY_DIR)/$(DHCP_RELAY_BINARY) + (cd $(TARGET_DIR)/var/lib; ln -sf /tmp dhcp) + cp -a $(DHCP_RELAY_DIR)/$(DHCP_RELAY_BINARY) $(TARGET_DIR)/$(DHCP_RELAY_TARGET_BINARY) + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +dhcp_relay: uclibc $(TARGET_DIR)/$(DHCP_RELAY_TARGET_BINARY) + +dhcp_relay-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(DHCP_RELAY_DIR) uninstall + -$(MAKE) -C $(DHCP_RELAY_DIR) clean + +dhcp_relay-dirclean: + rm -rf $(DHCP_RELAY_DIR) + diff --git a/obsolete-buildroot/make/diffutils.mk b/obsolete-buildroot/make/diffutils.mk new file mode 100644 index 0000000000..0019bd8d44 --- /dev/null +++ b/obsolete-buildroot/make/diffutils.mk @@ -0,0 +1,61 @@ +############################################################# +# +# diffutils +# +############################################################# +DIFFUTILS_SOURCE:=diffutils-2.8.4.tar.gz +DIFFUTILS_SITE:=ftp://alpha.gnu.org/gnu/diffutils/ +DIFFUTILS_CAT:=zcat +DIFFUTILS_DIR:=$(BUILD_DIR)/diffutils-2.8.4 +DIFFUTILS_BINARY:=src/diff +DIFFUTILS_TARGET_BINARY:=usr/bin/diff + +$(DL_DIR)/$(DIFFUTILS_SOURCE): + $(WGET) -P $(DL_DIR) $(DIFFUTILS_SITE)/$(DIFFUTILS_SOURCE) + +diffutils-source: $(DL_DIR)/$(DIFFUTILS_SOURCE) + +$(DIFFUTILS_DIR)/.unpacked: $(DL_DIR)/$(DIFFUTILS_SOURCE) + $(DIFFUTILS_CAT) $(DL_DIR)/$(DIFFUTILS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(DIFFUTILS_DIR)/.unpacked + +$(DIFFUTILS_DIR)/.configured: $(DIFFUTILS_DIR)/.unpacked + (cd $(DIFFUTILS_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(DIFFUTILS_DIR)/.configured + +$(DIFFUTILS_DIR)/$(DIFFUTILS_BINARY): $(DIFFUTILS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(DIFFUTILS_DIR) + +$(TARGET_DIR)/$(DIFFUTILS_TARGET_BINARY): $(DIFFUTILS_DIR)/$(DIFFUTILS_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(DIFFUTILS_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +diffutils: uclibc $(TARGET_DIR)/$(DIFFUTILS_TARGET_BINARY) + +diffutils-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(DIFFUTILS_DIR) uninstall + -$(MAKE) -C $(DIFFUTILS_DIR) clean + +diffutils-dirclean: + rm -rf $(DIFFUTILS_DIR) + diff --git a/obsolete-buildroot/make/dnsmasq.mk b/obsolete-buildroot/make/dnsmasq.mk new file mode 100644 index 0000000000..7944d62114 --- /dev/null +++ b/obsolete-buildroot/make/dnsmasq.mk @@ -0,0 +1,50 @@ +############################################################# +# +# dnsmasq +# +############################################################# + +DNSMASQ_SITE=http://thekelleys.org.uk/dnsmasq +ifeq ($(filter $(TARGETS),dnsmasq1),) +DNSMASQ_SOURCE=dnsmasq-2.6.tar.gz +DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-2.6 +DNSMASQ_VER=dnsmasq2 +else +DNSMASQ_SOURCE=dnsmasq-1.18.tar.gz +DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-1.18 +DNSMASQ_VER=dnsmasq1 +endif +DNSMASQ_BINARY=dnsmasq +DNSMASQ_TARGET_BINARY=usr/sbin/dnsmasq + +$(DL_DIR)/$(DNSMASQ_SOURCE): + $(WGET) -P $(DL_DIR) $(DNSMASQ_SITE)/$(DNSMASQ_SOURCE) + +$(DNSMASQ_DIR)/.source: $(DL_DIR)/$(DNSMASQ_SOURCE) + zcat $(DL_DIR)/$(DNSMASQ_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SOURCE_DIR)/patch-kernel.sh $(DNSMASQ_DIR) $(SOURCE_DIR) \ + $(DNSMASQ_VER)-*.patch + touch $(DNSMASQ_DIR)/.source + +$(DNSMASQ_DIR)/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.source + $(MAKE) CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \ + BINDIR=/usr/sbin MANDIR=/usr/man -C $(DNSMASQ_DIR) + +$(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY): $(DNSMASQ_DIR)/$(DNSMASQ_BINARY) + $(MAKE) BINDIR=/usr/sbin MANDIR=/usr/man \ + DESTDIR=$(TARGET_DIR) -C $(DNSMASQ_DIR) install + $(STRIP) $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + rm -rf $(TARGET_DIR)/usr/man + +dnsmasq: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + +dnsmasq1: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + +dnsmasq-source: $(DL_DIR)/$(DNSMASQ_SOURCE) + +dnsmasq-clean: + #$(MAKE) prefix=$(TARGET_DIR)/usr -C $(DNSMASQ_DIR) uninstall + -$(MAKE) -C $(DNSMASQ_DIR) clean + +dnsmasq-dirclean: + rm -rf $(DNSMASQ_DIR) diff --git a/obsolete-buildroot/make/dropbear_sshd.mk b/obsolete-buildroot/make/dropbear_sshd.mk new file mode 100644 index 0000000000..d694508f92 --- /dev/null +++ b/obsolete-buildroot/make/dropbear_sshd.mk @@ -0,0 +1,74 @@ +############################################################# +# +# dropbear_sshd +# +############################################################# +DROPBEAR_SSHD_SOURCE:=dropbear-0.41.tar.bz2 +DROPBEAR_SSHD_SITE:=http://matt.ucc.asn.au/dropbear/releases/ +DROPBEAR_SSHD_DIR:=$(BUILD_DIR)/dropbear-0.41 +DROPBEAR_SSHD_CAT:=bzcat +DROPBEAR_SSHD_BINARY:=dropbearmulti +DROPBEAR_SSHD_TARGET_BINARY:=usr/sbin/dropbear + + +$(DL_DIR)/$(DROPBEAR_SSHD_SOURCE): + $(WGET) -P $(DL_DIR) $(DROPBEAR_SSHD_SITE)/$(DROPBEAR_SSHD_SOURCE) + +dropbear_sshd-source: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) + +$(DROPBEAR_SSHD_DIR)/.unpacked: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) + $(DROPBEAR_SSHD_CAT) $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SOURCE_DIR)/patch-kernel.sh $(DROPBEAR_SSHD_DIR) $(SOURCE_DIR) dropbear-*.patch + $(SED) 's,^/\* #define DROPBEAR_MULTI.*,#define DROPBEAR_MULTI,g' $(DROPBEAR_SSHD_DIR)/options.h + touch $(DROPBEAR_SSHD_DIR)/.unpacked + +$(DROPBEAR_SSHD_DIR)/.configured: $(DROPBEAR_SSHD_DIR)/.unpacked + (cd $(DROPBEAR_SSHD_DIR); rm -rf config.cache; \ + autoconf; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-shared \ + ); + touch $(DROPBEAR_SSHD_DIR)/.configured + +$(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY): $(DROPBEAR_SSHD_DIR)/.configured + $(MAKE) $(TARGET_CONFIGURE_OPTS) LD=$(TARGET_CC) \ + -C $(DROPBEAR_SSHD_DIR) dropbearmulti + +$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY): $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) + #$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \ + # LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + install -d -m 755 $(TARGET_DIR)/usr/sbin + install -d -m 755 $(TARGET_DIR)/usr/bin + install -m 755 $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) \ + $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY) + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearkey + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearconvert + +dropbear_sshd: uclibc zlib $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY) + +dropbear_sshd-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \ + LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) uninstall + -$(MAKE) -C $(DROPBEAR_SSHD_DIR) clean + +dropbear_sshd-dirclean: + rm -rf $(DROPBEAR_SSHD_DIR) + diff --git a/obsolete-buildroot/make/ed.mk b/obsolete-buildroot/make/ed.mk new file mode 100644 index 0000000000..de6c3cb251 --- /dev/null +++ b/obsolete-buildroot/make/ed.mk @@ -0,0 +1,55 @@ +############################################################# +# +# ed +# +############################################################# +ED_SOURCE:=ed_0.2.orig.tar.gz +ED_PATCH:=ed_0.2-19.diff.gz +ED_SITE:=http://ftp.debian.org/debian/pool/main/e/ed +ED_CAT:=zcat +ED_DIR:=$(BUILD_DIR)/ed-0.2 +ED_BINARY:=ed +ED_TARGET_BINARY:=bin/ed + +$(DL_DIR)/$(ED_SOURCE): + $(WGET) -P $(DL_DIR) $(ED_SITE)/$(ED_SOURCE) + +$(DL_DIR)/$(ED_PATCH): + $(WGET) -P $(DL_DIR) $(ED_SITE)/$(ED_PATCH) + +ed-source: $(DL_DIR)/$(ED_SOURCE) $(DL_DIR)/$(ED_PATCH) + +$(ED_DIR)/.unpacked: $(DL_DIR)/$(ED_SOURCE) $(DL_DIR)/$(ED_PATCH) + $(ED_CAT) $(DL_DIR)/$(ED_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SOURCE_DIR)/patch-kernel.sh $(ED_DIR) $(DL_DIR) $(ED_PATCH) + touch $(ED_DIR)/.unpacked + +$(ED_DIR)/.configured: $(ED_DIR)/.unpacked + (cd $(ED_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + $(DISABLE_NLS) \ + ); + touch $(ED_DIR)/.configured + +$(ED_DIR)/$(ED_BINARY): $(ED_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(ED_DIR) + +$(TARGET_DIR)/$(ED_TARGET_BINARY): $(ED_DIR)/$(ED_BINARY) + cp -a $(ED_DIR)/$(ED_BINARY) $(TARGET_DIR)/$(ED_TARGET_BINARY) + +ed: uclibc $(TARGET_DIR)/$(ED_TARGET_BINARY) + +ed-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(ED_DIR) uninstall + -$(MAKE) -C $(ED_DIR) clean + +ed-dirclean: + rm -rf $(ED_DIR) + diff --git a/obsolete-buildroot/make/ext2root.mk b/obsolete-buildroot/make/ext2root.mk new file mode 100644 index 0000000000..0c66c18a9a --- /dev/null +++ b/obsolete-buildroot/make/ext2root.mk @@ -0,0 +1,56 @@ +############################################################# +# +# genext2fs to build to target ext2 filesystems +# +############################################################# +GENEXT2_DIR=$(BUILD_DIR)/genext2fs-1.3 +GENEXT2_SOURCE=genext2fs_1.3.orig.tar.gz +GENEXT2_SITE=http://ftp.debian.org/debian/pool/main/g/genext2fs +GENEXT2_PATCH=$(SOURCE_DIR)/genext2fs.patch + +$(DL_DIR)/$(GENEXT2_SOURCE): + $(WGET) -P $(DL_DIR) $(GENEXT2_SITE)/$(GENEXT2_SOURCE) + +$(GENEXT2_DIR): $(DL_DIR)/$(GENEXT2_SOURCE) $(GENEXT2_PATCH) + zcat $(DL_DIR)/$(GENEXT2_SOURCE) | tar -C $(BUILD_DIR) -xvf - + mv $(GENEXT2_DIR).orig $(GENEXT2_DIR) + cat $(GENEXT2_PATCH) | patch -p1 -d $(GENEXT2_DIR) + +$(GENEXT2_DIR)/genext2fs: $(GENEXT2_DIR) + $(MAKE) CFLAGS="-Wall -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE \ + -D_FILE_OFFSET_BITS=64" -C $(GENEXT2_DIR); + touch -c $(GENEXT2_DIR)/genext2fs + +genext2fs: $(GENEXT2_DIR)/genext2fs + + + +############################################################# +# +# Build the ext2 root filesystem image +# +############################################################# + +# How much KB we want to add to the calculated size for slack space +#GENEXT2_ADDTOROOTSIZE=4096 +GENEXT2_ADDTOROOTSIZE=16384 +GENEXT2_REALSIZE=$(subst total,, $(shell LANG=C du $(TARGET_DIR) -s -c -k | grep total )) +GENEXT2_SIZE=$(shell expr $(GENEXT2_REALSIZE) + $(GENEXT2_ADDTOROOTSIZE)) +# We currently add about 400 device nodes, so add that into the total +GENEXT2_INODES=$(shell expr $(shell find $(TARGET_DIR) | wc -l) + 400) +#GENEXT2_SIZE=100000 + +ext2root: genext2fs + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + $(GENEXT2_DIR)/genext2fs -i $(GENEXT2_INODES) -b $(GENEXT2_SIZE) \ + -d $(TARGET_DIR) -q -D $(SOURCE_DIR)/device_table.txt $(IMAGE) + +ext2root-source: $(DL_DIR)/$(GENEXT2_SOURCE) + +ext2root-clean: + -$(MAKE) -C $(GENEXT2_DIR) clean + +ext2root-dirclean: + rm -rf $(GENEXT2_DIR) + diff --git a/obsolete-buildroot/make/fakeroot.mk b/obsolete-buildroot/make/fakeroot.mk new file mode 100644 index 0000000000..f56105f7f8 --- /dev/null +++ b/obsolete-buildroot/make/fakeroot.mk @@ -0,0 +1,63 @@ +############################################################# +# +# fakeroot +# +############################################################# +FAKEROOT_SOURCE:=fakeroot_0.7.5.tar.gz +FAKEROOT_SITE:=http://ftp.debian.org/debian/pool/main/f/fakeroot +FAKEROOT_CAT:=zcat +FAKEROOT_DIR:=$(BUILD_DIR)/fakeroot-0.7.5 + + +$(DL_DIR)/$(FAKEROOT_SOURCE): + $(WGET) -P $(DL_DIR) $(FAKEROOT_SITE)/$(FAKEROOT_SOURCE) + +fakeroot-source: $(DL_DIR)/$(FAKEROOT_SOURCE) + +$(FAKEROOT_DIR)/.unpacked: $(DL_DIR)/$(FAKEROOT_SOURCE) + $(FAKEROOT_CAT) $(DL_DIR)/$(FAKEROOT_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # If using busybox getopt, make it be quiet. + $(SED) "s,getopt --version,getopt --version 2>/dev/null," \ + $(FAKEROOT_DIR)/scripts/fakeroot + touch $(FAKEROOT_DIR)/.unpacked + +$(FAKEROOT_DIR)/.configured: $(FAKEROOT_DIR)/.unpacked + (cd $(FAKEROOT_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libdir=/usr/lib/libfakeroot \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(FAKEROOT_DIR)/.configured + +$(FAKEROOT_DIR)/faked: $(FAKEROOT_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(FAKEROOT_DIR) + +$(TARGET_DIR)/usr/bin/fakeroot: $(FAKEROOT_DIR)/faked + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(FAKEROOT_DIR) install + -mv $(TARGET_DIR)/usr/bin/$(ARCH)-linux-faked $(TARGET_DIR)/usr/bin/faked + -mv $(TARGET_DIR)/usr/bin/$(ARCH)-linux-fakeroot $(TARGET_DIR)/usr/bin/fakeroot + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +fakeroot: uclibc $(TARGET_DIR)/usr/bin/fakeroot + +fakeroot-clean: + $(MAKE) -C $(FAKEROOT_DIR) clean + +fakeroot-dirclean: + rm -rf $(FAKEROOT_DIR) + + diff --git a/obsolete-buildroot/make/file.mk b/obsolete-buildroot/make/file.mk new file mode 100644 index 0000000000..e3ef381f40 --- /dev/null +++ b/obsolete-buildroot/make/file.mk @@ -0,0 +1,64 @@ +############################################################# +# +# file +# +############################################################# +FILE_SOURCE:=file-4.08.tar.gz +FILE_SITE:=ftp://ftp.astron.com/pub/file +FILE_DIR:=$(BUILD_DIR)/file-4.08 +FILE_CAT:=zcat +FILE_BINARY:=src/file +FILE_TARGET_BINARY:=usr/bin/file + +$(DL_DIR)/$(FILE_SOURCE): + $(WGET) -P $(DL_DIR) $(FILE_SITE)/$(FILE_SOURCE) + +file-source: $(DL_DIR)/$(FILE_SOURCE) + +$(FILE_DIR)/.unpacked: $(DL_DIR)/$(FILE_SOURCE) + $(FILE_CAT) $(DL_DIR)/$(FILE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(SOURCE_DIR)/file.patch | patch -p1 -d $(FILE_DIR) + touch $(FILE_DIR)/.unpacked + +$(FILE_DIR)/.configured: $(FILE_DIR)/.unpacked + (cd $(FILE_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share/misc \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + --disable-fsect-man5 \ + ); + touch $(FILE_DIR)/.configured + +$(FILE_DIR)/$(FILE_BINARY): $(FILE_DIR)/.configured + $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(FILE_DIR) + +$(TARGET_DIR)/$(FILE_TARGET_BINARY): $(FILE_DIR)/$(FILE_BINARY) + $(MAKE) $(TARGET_CONFIGURE_OPTS) DESTDIR=$(TARGET_DIR) -C $(FILE_DIR) install + -($(STRIP) $(TARGET_DIR)/usr/lib/libmagic.so.*.* > /dev/null 2>&1) + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +file: zlib uclibc $(TARGET_DIR)/$(FILE_TARGET_BINARY) + +file-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(FILE_DIR) uninstall + -$(MAKE) -C $(FILE_DIR) clean + +file-dirclean: + rm -rf $(FILE_DIR) + diff --git a/obsolete-buildroot/make/findutils.mk b/obsolete-buildroot/make/findutils.mk new file mode 100644 index 0000000000..0a68a13454 --- /dev/null +++ b/obsolete-buildroot/make/findutils.mk @@ -0,0 +1,70 @@ +############################################################# +# +# findutils +# +############################################################# +FINDUTILS_SOURCE:=findutils_4.1.7.orig.tar.gz +FINDUTILS_SITE:=http://ftp.debian.org/debian/pool/main/f/findutils +FINDUTILS_CAT:=zcat +FINDUTILS_DIR:=$(BUILD_DIR)/findutils-4.1.7 +FINDUTILS_BINARY:=find/find +FINDUTILS_TARGET_BINARY:=usr/bin/find + +$(DL_DIR)/$(FINDUTILS_SOURCE): + $(WGET) -P $(DL_DIR) $(FINDUTILS_SITE)/$(FINDUTILS_SOURCE) + +findutils-source: $(DL_DIR)/$(FINDUTILS_SOURCE) + +$(FINDUTILS_DIR)/.unpacked: $(DL_DIR)/$(FINDUTILS_SOURCE) + $(FINDUTILS_CAT) $(DL_DIR)/$(FINDUTILS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + mv $(FINDUTILS_DIR).orig $(FINDUTILS_DIR) + touch $(FINDUTILS_DIR)/.unpacked + +$(FINDUTILS_DIR)/.configured: $(FINDUTILS_DIR)/.unpacked + (cd $(FINDUTILS_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ac_cv_func_setvbuf_reversed=no \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib/locate \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var/lib \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(FINDUTILS_DIR)/.configured + +$(FINDUTILS_DIR)/$(FINDUTILS_BINARY): $(FINDUTILS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(FINDUTILS_DIR) + +# This stuff is needed to work around GNU make deficiencies +findutils-target_binary: $(FINDUTILS_DIR)/$(FINDUTILS_BINARY) + @if [ -L $(TARGET_DIR)/$(FINDUTILS_TARGET_BINARY) ] ; then \ + rm -f $(TARGET_DIR)/$(FINDUTILS_TARGET_BINARY); fi; + @if [ ! -f $(FINDUTILS_DIR)/$(FINDUTILS_BINARY) -o $(TARGET_DIR)/$(FINDUTILS_TARGET_BINARY) \ + -ot $(FINDUTILS_DIR)/$(FINDUTILS_BINARY) ] ; then \ + set -x; \ + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(FINDUTILS_DIR) install; \ + $(STRIP) $(TARGET_DIR)/usr/lib/locate/* > /dev/null 2>&1; \ + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc; fi; + +findutils: uclibc findutils-target_binary + +findutils-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(FINDUTILS_DIR) uninstall + -$(MAKE) -C $(FINDUTILS_DIR) clean + +findutils-dirclean: + rm -rf $(FINDUTILS_DIR) + diff --git a/obsolete-buildroot/make/flex.mk b/obsolete-buildroot/make/flex.mk new file mode 100644 index 0000000000..a29fa5875e --- /dev/null +++ b/obsolete-buildroot/make/flex.mk @@ -0,0 +1,81 @@ +############################################################# +# +# flex +# +############################################################# +FLEX_SOURCE:=flex_2.5.4a.orig.tar.gz +FLEX_PATCH:=flex_2.5.4a-24.diff.gz +FLEX_SITE:=http://ftp.debian.org/debian/pool/main/f/flex +FLEX_DIR:=$(BUILD_DIR)/flex-2.5.4 +FLEX_CAT:=zcat +FLEX_BINARY:=flex +FLEX_TARGET_BINARY:=usr/bin/flex + +$(DL_DIR)/$(FLEX_SOURCE): + $(WGET) -P $(DL_DIR) $(FLEX_SITE)/$(FLEX_SOURCE) + +$(DL_DIR)/$(FLEX_PATCH): + $(WGET) -P $(DL_DIR) $(FLEX_SITE)/$(FLEX_PATCH) + +flex-source: $(DL_DIR)/$(FLEX_SOURCE) $(DL_DIR)/$(FLEX_PATCH) + +$(FLEX_DIR)/.unpacked: $(DL_DIR)/$(FLEX_SOURCE) $(DL_DIR)/$(FLEX_PATCH) + $(FLEX_CAT) $(DL_DIR)/$(FLEX_SOURCE) | tar -C $(BUILD_DIR) -xvf - + #$(SOURCE_DIR)/patch-kernel.sh $(FLEX_DIR) $(DL_DIR) $(FLEX_PATCH) + touch $(FLEX_DIR)/.unpacked + +$(FLEX_DIR)/.configured: $(FLEX_DIR)/.unpacked + (cd $(FLEX_DIR); autoconf; rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(FLEX_DIR)/.configured + +$(FLEX_DIR)/$(FLEX_BINARY): $(FLEX_DIR)/.configured + $(MAKE) -C $(FLEX_DIR) + +$(TARGET_DIR)/$(FLEX_TARGET_BINARY): $(FLEX_DIR)/$(FLEX_BINARY) + $(MAKE) \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + bindir=$(TARGET_DIR)/usr/bin \ + sbindir=$(TARGET_DIR)/usr/sbin \ + libexecdir=$(TARGET_DIR)/usr/lib \ + datadir=$(TARGET_DIR)/usr/share \ + sysconfdir=$(TARGET_DIR)/etc \ + sharedstatedir=$(TARGET_DIR)/usr/com \ + localstatedir=$(TARGET_DIR)/var \ + libdir=$(TARGET_DIR)/usr/lib \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(TARGET_DIR)/usr/include \ + -C $(FLEX_DIR) install; + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + (cd $(TARGET_DIR)/usr/bin; ln -s flex lex) + +flex: uclibc $(TARGET_DIR)/$(FLEX_TARGET_BINARY) + +flex-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(FLEX_DIR) uninstall + -$(MAKE) -C $(FLEX_DIR) clean + +flex-dirclean: + rm -rf $(FLEX_DIR) + diff --git a/obsolete-buildroot/make/gawk.mk b/obsolete-buildroot/make/gawk.mk new file mode 100644 index 0000000000..523b0479bb --- /dev/null +++ b/obsolete-buildroot/make/gawk.mk @@ -0,0 +1,66 @@ +############################################################# +# +# gawk +# +############################################################# +GAWK_SOURCE:=gawk-3.1.2.tar.gz +GAWK_SITE:=ftp://ftp.gnu.org/gnu/gawk +GAWK_CAT:=zcat +GAWK_DIR:=$(BUILD_DIR)/gawk-3.1.2 +GAWK_BINARY:=gawk +GAWK_TARGET_BINARY:=usr/bin/gawk + +$(DL_DIR)/$(GAWK_SOURCE): + $(WGET) -P $(DL_DIR) $(GAWK_SITE)/$(GAWK_SOURCE) + +gawk-source: $(DL_DIR)/$(GAWK_SOURCE) + +$(GAWK_DIR)/.unpacked: $(DL_DIR)/$(GAWK_SOURCE) + $(GAWK_CAT) $(DL_DIR)/$(GAWK_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(GAWK_DIR)/.unpacked + +$(GAWK_DIR)/.configured: $(GAWK_DIR)/.unpacked + (cd $(GAWK_DIR); rm -rf config.cache; autoconf; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ac_cv_func_getpgrp_void=yes \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(GAWK_DIR)/.configured + +$(GAWK_DIR)/$(GAWK_BINARY): $(GAWK_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(GAWK_DIR) + +$(TARGET_DIR)/$(GAWK_TARGET_BINARY): $(GAWK_DIR)/$(GAWK_BINARY) + rm -f $(TARGET_DIR)/usr/bin/awk + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GAWK_DIR) install + rm -f $(TARGET_DIR)/usr/bin/gawk-* + (cd $(TARGET_DIR)/usr/bin; ln -sf gawk awk) + $(STRIP) $(TARGET_DIR)/usr/lib/awk/* > /dev/null 2>&1 + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +gawk: uclibc $(TARGET_DIR)/$(GAWK_TARGET_BINARY) + +gawk-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GAWK_DIR) uninstall + -$(MAKE) -C $(GAWK_DIR) clean + +gawk-dirclean: + rm -rf $(GAWK_DIR) + diff --git a/obsolete-buildroot/make/gcc-uclibc-2.95.mk b/obsolete-buildroot/make/gcc-uclibc-2.95.mk new file mode 100644 index 0000000000..9294b53f73 --- /dev/null +++ b/obsolete-buildroot/make/gcc-uclibc-2.95.mk @@ -0,0 +1,276 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen +# Copyright (C) 2004 Manuel Novoa III +# +# 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 + +ifeq ($(GCC_2_95_TOOLCHAIN),true) + +GCC_SITE:=http://www.uclibc.org/downloads/toolchain +GCC_SOURCE:=gcc-20011006.tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-20011006 +GCC_CAT:=bzcat + +STLPORT_SITE=http://www.stlport.org/archive +STLPORT_SOURCE=STLport-4.5.3.tar.gz +STLPORT_DIR=$(TOOL_BUILD_DIR)/STLport-4.5.3 +GCC_STRIP_HOST_BINARIES:=true + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(INSTALL_LIBSTDCPP),true) +TARGET_LANGUAGES:=c,c++ +STLPORT_TARGET=stlport +else +TARGET_LANGUAGES:=c +STLPORT_TARGET= +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc2_95-initial + +$(DL_DIR)/$(GCC_SOURCE): + $(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) + $(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - + touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked + # Apply any files named gcc-*.patch from the source directory to gcc + $(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc2.95-mega.patch.bz2 + $(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc2.95-uclibc-conf.patch + #$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc-uclibc2_95*.patch + # + # We do not wish to build the libstdc++ library provided with gcc, + # since it doesn't seem to work at all with uClibc plus gcc 2.95... + # + mv $(GCC_DIR)/libstdc++ $(GCC_DIR)/libstdc++.orig + mv $(GCC_DIR)/libio $(GCC_DIR)/libio.orig + # + touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched + mkdir -p $(GCC_BUILD_DIR1) + -mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include + # Important! Required for limits.h to be fixed. + ln -sf include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include + (cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=c \ + --disable-shared \ + --includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \ + --with-headers=$(TOOL_BUILD_DIR)/uClibc_dev/usr/include \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) all-gcc + touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) install-gcc + #rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov + #rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc2_95_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc2_95_initial-clean: + rm -rf $(GCC_BUILD_DIR1) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc2_95_initial-dirclean: + rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# STLport -- an alternative C++ library +# +############################################################# +STLPORT_PATCH=$(SOURCE_DIR)/STLport-4.5.3.patch + +$(DL_DIR)/$(STLPORT_SOURCE): + $(WGET) -P $(DL_DIR) $(STLPORT_SITE)/$(STLPORT_SOURCE) + +$(STLPORT_DIR)/Makefile: $(DL_DIR)/$(STLPORT_SOURCE) $(STLPORT_PATCH) + zcat $(DL_DIR)/$(STLPORT_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - + cat $(STLPORT_PATCH) | patch -d $(STLPORT_DIR) -p1 + +$(STLPORT_DIR)/lib/libstdc++.a: $(STLPORT_DIR)/Makefile + $(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) + +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a: $(STLPORT_DIR)/lib/libstdc++.a + $(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) install + +stlport: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a + +stlport-source: $(DL_DIR)/$(STLPORT_SOURCE) + +stlport-clean: + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++* + -$(MAKE) -C $(STLPORT_DIR) clean + +stlport-dirclean: + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/g++-v3* + rm -rf $(STLPORT_DIR) + +############################################################# +# +# second pass compiler build. Build the compiler targeting +# the newly built shared uClibc library. +# +############################################################# +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc2_95-final + +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + mkdir -p $(GCC_BUILD_DIR2) + (cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) all + touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) install + # Strip the host binaries +ifeq ($(GCC_STRIP_HOST_BINARIES),true) + -strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +endif + # Set up the symlinks to enable lying about target name. + set -e; \ + (cd $(STAGING_DIR); \ + ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ + cd bin; \ + for app in $(REAL_GNU_TARGET_NAME)-* ; do \ + ln -sf $${app} \ + $(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ + done; \ + ); + touch $(GCC_BUILD_DIR2)/.installed + +gcc2_95: uclibc-configured binutils gcc2_95_initial $(LIBFLOAT_TARGET) uclibc \ + $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) $(STLPORT_TARGET) + +gcc2_95-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc2_95-clean: + rm -rf $(GCC_BUILD_DIR2) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc2_95-dirclean: + rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc2_95-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed + mkdir -p $(GCC_BUILD_DIR3) + (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=/usr/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(JLEVEL) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all + touch $(GCC_BUILD_DIR3)/.compiled + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled + PATH=$(TARGET_PATH) \ + $(MAKE) $(JLEVEL) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install + # Remove broken specs file (cross compile flag is set). + rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs + -(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) + -(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) + # + rm -f $(TARGET_DIR)/usr/lib/*.la* + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Work around problem of missing syslimits.h + cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/ + # These are in /lib, so... + #rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + #touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc2_95_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc2_95_target-clean: + rm -rf $(GCC_BUILD_DIR3) + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc2_95_target-dirclean: + rm -rf $(GCC_BUILD_DIR3) + +endif diff --git a/obsolete-buildroot/make/gcc-uclibc-3.3.mk b/obsolete-buildroot/make/gcc-uclibc-3.3.mk new file mode 100644 index 0000000000..b3795e66a4 --- /dev/null +++ b/obsolete-buildroot/make/gcc-uclibc-3.3.mk @@ -0,0 +1,267 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen +# Copyright (C) 2004 Manuel Novoa III +# +# 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 + +ifneq ($(GCC_2_95_TOOLCHAIN),true) + +# Shiny new stuff... +GCC_VERSION:=3.3.3 +GCC_SITE:=ftp://ftp.gnu.org/gnu/gcc/releases/gcc-$(GCC_VERSION) +#GCC_SITE:=http://www.binarycode.org/gcc/releases/gcc-$(GCC_VERSION) +#GCC_SITE:=http://gcc.get-software.com/releases/gcc-$(GCC_VERSION) + +# +# snapshots.... +#GCC_VERSION:=3.3-20031013 +#GCC_SITE:=http://gcc.get-software.com/snapshots/$(GCC_VERSION) +# +GCC_SOURCE:=gcc-$(GCC_VERSION).tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION) +GCC_CAT:=bzcat +GCC_STRIP_HOST_BINARIES:=true + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(INSTALL_LIBGCJ),true) +TARGET_LANGUAGES:=c,c++,java +else +ifeq ($(INSTALL_LIBSTDCPP),true) +TARGET_LANGUAGES:=c,c++ +else +TARGET_LANGUAGES:=c +endif +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-3.3-initial + +$(DL_DIR)/$(GCC_SOURCE): + $(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) + $(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - + touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked + # Apply any files named gcc-*.patch from the source directory to gcc + $(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc3.3-mega.patch.bz2 + $(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc-uclibc-3.3*.patch +ifeq ($(SOFT_FLOAT),true) +ifeq ("$(strip $(ARCH))","i386") + $(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) i386-gcc-soft-float.patch +endif +endif + touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched + mkdir -p $(GCC_BUILD_DIR1) + -mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include + (cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=c \ + --disable-shared \ + --includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \ + --with-sysroot=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) all-gcc + touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) install-gcc + #rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov + #rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc3_3_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc3_3_initial-clean: + rm -rf $(GCC_BUILD_DIR1) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc3_3_initial-dirclean: + rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# second pass compiler build. Build the compiler targeting +# the newly built shared uClibc library. +# +############################################################# +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-3.3-final +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + mkdir -p $(GCC_BUILD_DIR2) + # Important! Required for limits.h to be fixed. + ln -sf include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include + (cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_USE_SJLJ_EXCEPTIONS) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) all + touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled + PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) install + # Strip the host binaries +ifeq ($(GCC_STRIP_HOST_BINARIES),true) + -strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +endif + # Set up the symlinks to enable lying about target name. + set -e; \ + (cd $(STAGING_DIR); \ + ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ + cd bin; \ + for app in $(REAL_GNU_TARGET_NAME)-* ; do \ + ln -sf $${app} \ + $(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ + done; \ + ); +ifeq ($(SOFT_FLOAT),true) + # Replace specs file with one that defaults to soft float mode. + if [ ! -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs ] ; then \ + echo staging dir specs file is missing ; \ + /bin/false ; \ + fi; + cp $(SOURCE_DIR)/specs-$(ARCH)-soft-float $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +endif + touch $(GCC_BUILD_DIR2)/.installed + +gcc3_3: uclibc-configured binutils gcc3_3_initial $(LIBFLOAT_TARGET) uclibc \ + $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) + +gcc3_3-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc3_3-clean: + rm -rf $(GCC_BUILD_DIR2) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc3_3-dirclean: + rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-3.3-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed + mkdir -p $(GCC_BUILD_DIR3) + (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=/usr/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_USE_SJLJ_EXCEPTIONS) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(JLEVEL) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all + touch $(GCC_BUILD_DIR3)/.compiled + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled + PATH=$(TARGET_PATH) \ + $(MAKE) $(JLEVEL) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install +ifeq ($(SOFT_FLOAT),true) + # Replace specs file with one that defaults to soft float mode. + if [ ! -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs ] ; then \ + echo target dir specs file is missing ; \ + /bin/false ; \ + fi; + cp $(SOURCE_DIR)/specs-$(ARCH)-soft-float $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs + # Make sure gcc does not think we are cross compiling + $(SED) "s/^1/0/;" $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +else + # Remove broken specs file (cross compile flag is set). + rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +endif + -(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) + -(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) + # + rm -f $(TARGET_DIR)/usr/lib/*.la* + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Work around problem of missing syslimits.h + cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/ + # These are in /lib, so... + #rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + #touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc3_3_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc3_3_target-clean: + rm -rf $(GCC_BUILD_DIR3) + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc3_3_target-dirclean: + rm -rf $(GCC_BUILD_DIR3) + +endif diff --git a/obsolete-buildroot/make/gdb.mk b/obsolete-buildroot/make/gdb.mk new file mode 100644 index 0000000000..59a08be3d5 --- /dev/null +++ b/obsolete-buildroot/make/gdb.mk @@ -0,0 +1,80 @@ +############################################################# +# +# gdb +# +############################################################# + +GDB_SITE:=ftp://ftp.gnu.org/gnu/gdb/ +GDB_DIR:=$(BUILD_DIR)/gdb-5.3 +GDB_SOURCE:=gdb-5.3.tar.gz +GDB_PATCH:=$(SOURCE_DIR)/gdb.patch +GDB_UCLIBC_PATCH:=$(SOURCE_DIR)/gdb-5.3-uclibc.patch + +$(DL_DIR)/$(GDB_SOURCE): + $(WGET) -P $(DL_DIR) $(GDB_SITE)/$(GDB_SOURCE) + +$(GDB_DIR)/.unpacked: $(DL_DIR)/$(GDB_SOURCE) $(GDB_PATCH) + gunzip -c $(DL_DIR)/$(GDB_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(GDB_PATCH) | patch -p1 -d $(GDB_DIR) + cat $(GDB_UCLIBC_PATCH) | patch -p1 -d $(GDB_DIR) + touch $(GDB_DIR)/.unpacked + +$(GDB_DIR)/.configured: $(GDB_DIR)/.unpacked + # Copy a config.sub from gcc. This is only necessary until + # gdb's config.sub supports -linux-uclibc tuples. + cp $(GCC_DIR)/config.sub $(GDB_DIR) + cp $(GCC_DIR)/config.sub $(GDB_DIR)/readline/support/ + (cd $(GDB_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ac_cv_type_uintptr_t=yes \ + gt_cv_func_gettext_libintl=yes \ + ac_cv_func_dcgettext=yes \ + gdb_cv_func_sigsetjmp=yes \ + bash_cv_func_strcoll_broken=no \ + bash_cv_must_reinstall_sighandlers=no \ + bash_cv_func_sigsetjmp=present \ + ./configure \ + --target=$(REAL_GNU_TARGET_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --includedir=$(STAGING_DIR)/include \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --disable-sim --enable-gdbserver \ + --without-included-gettext \ + ); +ifeq ($(ENABLE_LOCALE),true) + -$(SED) "s,^INTL *=.*,INTL = -lintl,g;" $(GDB_DIR)/gdb/Makefile +endif + touch $(GDB_DIR)/.configured + +$(GDB_DIR)/gdb/gdb: $(GDB_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(GDB_DIR) + $(STRIP) $(GDB_DIR)/gdb/gdb + +$(TARGET_DIR)/usr/bin/gdb: $(GDB_DIR)/gdb/gdb + install -c $(GDB_DIR)/gdb/gdb $(TARGET_DIR)/usr/bin/gdb + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +gdb: $(TARGET_DIR)/usr/bin/gdb + +gdb-source: $(DL_DIR)/$(GDB_SOURCE) + +gdb-clean: + $(MAKE) -C $(GDB_DIR) clean + +gdb-dirclean: + rm -rf $(GDB_DIR) + diff --git a/obsolete-buildroot/make/gdbserver.mk b/obsolete-buildroot/make/gdbserver.mk new file mode 100644 index 0000000000..1ab44a2367 --- /dev/null +++ b/obsolete-buildroot/make/gdbserver.mk @@ -0,0 +1,53 @@ +############################################################# +# +# gdbserver +# +############################################################# + +#Use GDB_DIR/etc values from gdb.mk +#Build gdbserver in a dir outside of the main gdb tree +GDB_WDIR:=$(BUILD_DIR)/gdbserver + + +$(GDB_WDIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_WDIR) + (cd $(GDB_WDIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + $(GDB_DIR)/gdb/gdbserver/configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --includedir=$(STAGING_DIR)/include \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --without-included-gettext \ + ); + touch $(GDB_WDIR)/.configured + +$(GDB_WDIR)/gdbserver: $(GDB_WDIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(GDB_WDIR) + $(STRIP) $(GDB_WDIR)/gdbserver + +$(TARGET_DIR)/usr/bin/gdbserver: $(GDB_WDIR)/gdbserver + install -c $(GDB_WDIR)/gdbserver $(TARGET_DIR)/usr/bin/gdbserver + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +gdbserver: $(TARGET_DIR)/usr/bin/gdbserver + +gdbserver-clean: + $(MAKE) -C $(GDB_WDIR) clean + +gdbserver-dirclean: + rm -rf $(GDB_WDIR) + diff --git a/obsolete-buildroot/make/gettext.mk b/obsolete-buildroot/make/gettext.mk new file mode 100644 index 0000000000..84c7a25bc2 --- /dev/null +++ b/obsolete-buildroot/make/gettext.mk @@ -0,0 +1,60 @@ +############################################################# +# +# gettext +# +############################################################# +GETTEXT_SOURCE:=gettext-0.11.5.tar.gz +GETTEXT_SITE:=ftp://ftp.gnu.org/gnu/gettext +GETTEXT_DIR:=$(BUILD_DIR)/gettext-0.11.5 +GETTEXT_CAT:=zcat +GETTEXT_BINARY:=gettext +GETTEXT_TARGET_BINARY:=usr/bin/gettext + +$(DL_DIR)/$(GETTEXT_SOURCE): + $(WGET) -P $(DL_DIR) $(GETTEXT_SITE)/$(GETTEXT_SOURCE) + +gettext-source: $(DL_DIR)/$(GETTEXT_SOURCE) + +$(GETTEXT_DIR)/.unpacked: $(DL_DIR)/$(GETTEXT_SOURCE) + $(GETTEXT_CAT) $(DL_DIR)/$(GETTEXT_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(GETTEXT_DIR)/.unpacked + +$(GETTEXT_DIR)/.configured: $(GETTEXT_DIR)/.unpacked + (cd $(GETTEXT_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + ); + touch $(GETTEXT_DIR)/.configured + +$(GETTEXT_DIR)/$(GETTEXT_BINARY): $(GETTEXT_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(GETTEXT_DIR) + +$(TARGET_DIR)/$(GETTEXT_TARGET_BINARY): $(GETTEXT_DIR)/$(GETTEXT_BINARY) + $(MAKE) DESTDIR=$(STAGING_DIR) CC=$(TARGET_CC) -C $(GETTEXT_DIR) install + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GETTEXT_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc \ + $(TARGET_DIR)/usr/doc + +gettext: uclibc $(TARGET_DIR)/$(GETTEXT_TARGET_BINARY) + +gettext-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GETTEXT_DIR) uninstall + -$(MAKE) -C $(GETTEXT_DIR) clean + +gettext-dirclean: + rm -rf $(GETTEXT_DIR) + diff --git a/obsolete-buildroot/make/grep.mk b/obsolete-buildroot/make/grep.mk new file mode 100644 index 0000000000..cc7856c087 --- /dev/null +++ b/obsolete-buildroot/make/grep.mk @@ -0,0 +1,73 @@ +############################################################# +# +# grep +# +############################################################# +GNUGREP_SOURCE:=grep_2.5.1.ds1.orig.tar.gz +GNUGREP_SITE:=http://ftp.debian.org/debian/pool/main/g/grep/ +GNUGREP_DIR:=$(BUILD_DIR)/grep-2.5.1 +GNUGREP_CAT:=zcat +GNUGREP_BINARY:=src/grep +GNUGREP_TARGET_BINARY:=bin/grep + +$(DL_DIR)/$(GNUGREP_SOURCE): + $(WGET) -P $(DL_DIR) $(GNUGREP_SITE)/$(GNUGREP_SOURCE) + +grep-source: $(DL_DIR)/$(GNUGREP_SOURCE) + +$(GNUGREP_DIR)/.unpacked: $(DL_DIR)/$(GNUGREP_SOURCE) + rm -rf $(GNUGREP_DIR).xxx + $(GNUGREP_CAT) $(DL_DIR)/$(GNUGREP_SOURCE) | tar -C $(BUILD_DIR) -xvf - + mv $(GNUGREP_DIR) $(GNUGREP_DIR).xxx + $(GNUGREP_CAT) $(GNUGREP_DIR).xxx/grep_2.5.1.tar.gz | tar -C $(BUILD_DIR) -xvf - + rm -rf $(GNUGREP_DIR).xxx + touch $(GNUGREP_DIR)/.unpacked + +$(GNUGREP_DIR)/.configured: $(GNUGREP_DIR)/.unpacked + (cd $(GNUGREP_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + --disable-perl-regexp \ + --without-included-regex \ + ); + touch $(GNUGREP_DIR)/.configured + +$(GNUGREP_DIR)/$(GNUGREP_BINARY): $(GNUGREP_DIR)/.configured + $(MAKE) -C $(GNUGREP_DIR) + +# This stuff is needed to work around GNU make deficiencies +grep-target_binary: $(GNUGREP_DIR)/$(GNUGREP_BINARY) + @if [ -L $(TARGET_DIR)/$(GNUGREP_TARGET_BINARY) ] ; then \ + rm -f $(TARGET_DIR)/$(GNUGREP_TARGET_BINARY); fi; + @if [ ! -f $(GNUGREP_DIR)/$(GNUGREP_BINARY) -o $(TARGET_DIR)/$(GNUGREP_TARGET_BINARY) -ot \ + $(GNUGREP_DIR)/$(GNUGREP_BINARY) ] ; then \ + set -x; \ + rm -f $(TARGET_DIR)/bin/grep $(TARGET_DIR)/bin/egrep $(TARGET_DIR)/bin/fgrep; \ + cp -a $(GNUGREP_DIR)/src/grep $(GNUGREP_DIR)/src/egrep \ + $(GNUGREP_DIR)/src/fgrep $(TARGET_DIR)/bin/; fi + +grep: uclibc grep-target_binary + +grep-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GNUGREP_DIR) uninstall + -$(MAKE) -C $(GNUGREP_DIR) clean + +grep-dirclean: + rm -rf $(GNUGREP_DIR) + diff --git a/obsolete-buildroot/make/gzip.mk b/obsolete-buildroot/make/gzip.mk new file mode 100644 index 0000000000..8098dd9333 --- /dev/null +++ b/obsolete-buildroot/make/gzip.mk @@ -0,0 +1,70 @@ +############################################################# +# +# gzip +# +############################################################# +GZIP_SOURCE:=gzip-1.3.5.tar.gz +GZIP_SITE:=ftp://alpha.gnu.org/gnu/gzip +GZIP_DIR:=$(BUILD_DIR)/gzip-1.3.5 +GZIP_CAT:=zcat +GZIP_BINARY:=$(GZIP_DIR)/gzip +GZIP_TARGET_BINARY:=$(TARGET_DIR)/bin/zmore + +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),false) +GZIP_LARGEFILE="--disable-largefile" +endif + +$(DL_DIR)/$(GZIP_SOURCE): + $(WGET) -P $(DL_DIR) $(GZIP_SITE)/$(GZIP_SOURCE) + +gzip-source: $(DL_DIR)/$(GZIP_SOURCE) + +$(GZIP_DIR)/.unpacked: $(DL_DIR)/$(GZIP_SOURCE) + $(GZIP_CAT) $(DL_DIR)/$(GZIP_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(GZIP_DIR)/.unpacked + +$(GZIP_DIR)/.configured: $(GZIP_DIR)/.unpacked + (cd $(GZIP_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/ \ + --bindir=/bin \ + --sbindir=/bin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share/misc \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(GZIP_LARGEFILE) \ + ); + touch $(GZIP_DIR)/.configured + +$(GZIP_BINARY): $(GZIP_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(GZIP_DIR) + +$(GZIP_TARGET_BINARY): $(GZIP_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GZIP_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + (cd $(TARGET_DIR)/bin; \ + ln -sf gzip gunzip; \ + ln -sf gzip zcat; \ + ln -sf zdiff zcmp; \ + ln -sf zgrep zegrep; \ + ln -sf zgrep zfgrep;) + +gzip: uclibc $(GZIP_TARGET_BINARY) + +gzip-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GZIP_DIR) uninstall + -$(MAKE) -C $(GZIP_DIR) clean + +gzip-dirclean: + rm -rf $(GZIP_DIR) + diff --git a/obsolete-buildroot/make/hostap.mk b/obsolete-buildroot/make/hostap.mk new file mode 100644 index 0000000000..b7908fd170 --- /dev/null +++ b/obsolete-buildroot/make/hostap.mk @@ -0,0 +1,53 @@ +############################################################# +# +# hostap +# +############################################################# +HOSTAP_SOURCE_URL=http://hostap.epitest.fi/cgi-bin/viewcvs.cgi/hostap/hostap.tar.gz?tarball=1 +HOSTAP_SOURCE=hostap.tar.gz +HOSTAP_DIR=$(BUILD_DIR)/hostap-snapshot + +$(DL_DIR)/$(HOSTAP_SOURCE): + $(WGET) -P $(DL_DIR) $(HOSTAP_SOURCE_URL) -O $(DL_DIR)/$(HOSTAP_SOURCE) + +hostap-source: $(DL_DIR)/$(HOSTAP_SOURCE) + +$(HOSTAP_DIR)/.unpacked: $(DL_DIR)/$(HOSTAP_SOURCE) + zcat $(DL_DIR)/$(HOSTAP_SOURCE) | tar -C $(BUILD_DIR) -xvf - + mv -f $(BUILD_DIR)/hostap $(HOSTAP_DIR) + touch $(HOSTAP_DIR)/.unpacked + +$(HOSTAP_DIR)/.configured: $(HOSTAP_DIR)/.unpacked + #$(SED) "s,/.*#define PRISM2_DOWNLOAD_SUPPORT.*/,#define PRISM2_DOWNLOAD_SUPPORT,g" \ + # $(HOSTAP_DIR)/driver/modules/hostap_config.h + touch $(HOSTAP_DIR)/.configured + +$(HOSTAP_DIR)/utils/hostap_crypt_conf: $(HOSTAP_DIR)/.configured + $(MAKE) -C $(HOSTAP_DIR)/utils CC=$(TARGET_CC) CFLAGS="-Os -Wall $(TARGET_CFLAGS) -I../driver/modules" + $(MAKE) -C $(HOSTAP_DIR)/hostapd CC=$(TARGET_CC) CFLAGS="-Os -Wall $(TARGET_CFLAGS) -I../driver/modules -I../utils" + touch -c $(HOSTAP_DIR)/driver/modules/hostap.o + +$(TARGET_DIR)//usr/bin/hostap_crypt_conf: $(HOSTAP_DIR)/utils/hostap_crypt_conf + # Make the dir + -rm -rf $(HOSTAP_TARGET_MODULE_DIR) + -mkdir -p $(HOSTAP_TARGET_MODULE_DIR) + # Copy the pcmcia-cs conf file + -mkdir -p $(TARGET_DIR)/etc/pcmcia + cp -af $(HOSTAP_DIR)/driver/etc/hostap_cs.conf $(TARGET_DIR)/etc/pcmcia/ + # Copy The Utils + cp -af $(HOSTAP_DIR)/utils/hostap_crypt_conf $(TARGET_DIR)/usr/bin/ + cp -af $(HOSTAP_DIR)/utils/hostap_diag $(TARGET_DIR)/usr/bin/ + cp -af $(HOSTAP_DIR)/utils/prism2_param $(TARGET_DIR)/usr/bin/ + cp -af $(HOSTAP_DIR)/utils/prism2_srec $(TARGET_DIR)/usr/bin/ + # Copy hostapd + cp -af $(HOSTAP_DIR)/hostapd/hostapd $(TARGET_DIR)/usr/sbin/ + +hostap: pcmcia $(TARGET_DIR)//usr/bin/hostap_crypt_conf + +hostap-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(HOSTAP_DIR) uninstall + -$(MAKE) -C $(HOSTAP_DIR) clean + +hostap-dirclean: + rm -rf $(HOSTAP_DIR) + diff --git a/obsolete-buildroot/make/hotplug.mk b/obsolete-buildroot/make/hotplug.mk new file mode 100644 index 0000000000..e13a6025dd --- /dev/null +++ b/obsolete-buildroot/make/hotplug.mk @@ -0,0 +1,39 @@ +############################################################# +# +# hotplug support +# +############################################################# +HOTPLUG_SOURCE=diethotplug-0.4.tar.gz +HOTPLUG_SITE=http://aleron.dl.sourceforge.net/sourceforge/linux-hotplug +HOTPLUG_DIR=$(BUILD_DIR)/diethotplug-0.4 +HOTPLUG_PATCH=$(SOURCE_DIR)/hotplug.patch + +$(DL_DIR)/$(HOTPLUG_SOURCE): + $(WGET) -P $(DL_DIR) $(HOTPLUG_SITE)/$(HOTPLUG_SOURCE) + +$(HOTPLUG_DIR): $(DL_DIR)/$(HOTPLUG_SOURCE) $(HOTPLUG_PATCH) + zcat $(DL_DIR)/$(HOTPLUG_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(HOTPLUG_PATCH) | patch -p1 -d $(HOTPLUG_DIR) + +$(HOTPLUG_DIR)/hotplug: $(HOTPLUG_DIR) + $(MAKE) CROSS=$(TARGET_CROSS) DEBUG=false KLIBC=false \ + KERNEL_INCLUDE_DIR=$(STAGING_DIR)/include \ + TARGET_DIR=$(TARGET_DIR) -C $(HOTPLUG_DIR); + $(STRIP) $(HOTPLUG_DIR)/hotplug; + touch -c $(HOTPLUG_DIR)/hotplug + +$(TARGET_DIR)/sbin/hotplug: $(HOTPLUG_DIR)/hotplug + cp $(HOTPLUG_DIR)/hotplug $(TARGET_DIR)/sbin/hotplug; + touch -c $(TARGET_DIR)/sbin/hotplug + +hotplug: uclibc $(TARGET_DIR)/sbin/hotplug + +hotplug-source: $(DL_DIR)/$(HOTPLUG_SOURCE) + +hotplug-clean: + rm -f $(TARGET_DIR)/sbin/hotplug + -$(MAKE) -C $(HOTPLUG_DIR) clean + +hotplug-dirclean: + rm -rf $(HOTPLUG_DIR) + diff --git a/obsolete-buildroot/make/iproute2.mk b/obsolete-buildroot/make/iproute2.mk new file mode 100644 index 0000000000..7a33034b62 --- /dev/null +++ b/obsolete-buildroot/make/iproute2.mk @@ -0,0 +1,57 @@ +############################################################# +# +# iproute2 +# +############################################################# +IPROUTE2_DIR=$(BUILD_DIR)/iproute2 + +#IPROUTE2_SOURCE_URL=ftp://ftp.inr.ac.ru/ip-routing/ +#IPROUTE2_SOURCE=iproute2-2.4.7-now-ss020116-try.tar.gz + +#Use the debian source for now, as the .ru site has availability problems +IPROUTE2_SOURCE_URL=http://ftp.debian.org/debian/pool/main/i/iproute/ +IPROUTE2_SOURCE=iproute_20010824.orig.tar.gz +IPROUTE2_PATCH:=iproute_20010824-8.diff.gz + + +$(DL_DIR)/$(IPROUTE2_SOURCE): + $(WGET) -P $(DL_DIR) $(IPROUTE2_SOURCE_URL)$(IPROUTE2_SOURCE) + +$(DL_DIR)/$(IPROUTE2_PATCH): + $(WGET) -P $(DL_DIR) $(IPROUTE2_SOURCE_URL)/$(IPROUTE2_PATCH) + +iproute2-source: $(DL_DIR)/$(IPROUTE2_SOURCE) #$(DL_DIR)/$(IPROUTE2_PATCH) + +$(IPROUTE2_DIR)/.unpacked: $(DL_DIR)/$(IPROUTE2_SOURCE) #$(DL_DIR)/$(IPROUTE2_PATCH) + rm -rf $(IPROUTE2_DIR).orig $(IPROUTE2_DIR) + zcat $(DL_DIR)/$(IPROUTE2_SOURCE) | tar -C $(BUILD_DIR) -xvf - + #zcat $(DL_DIR)/$(IPROUTE2_PATCH) | patch -p1 -d $(IPROUTE2_DIR) + touch $(IPROUTE2_DIR)/.unpacked + +$(IPROUTE2_DIR)/.configured: $(IPROUTE2_DIR)/.unpacked + $(SED) "s,-I/usr/include/db3,," $(IPROUTE2_DIR)/Makefile + $(SED) "s,^KERNEL_INCLUDE.*,KERNEL_INCLUDE=$(LINUX_DIR)/include," \ + $(IPROUTE2_DIR)/Makefile + $(SED) "s,^LIBC_INCLUDE.*,LIBC_INCLUDE=$(STAGING_DIR)/include," \ + $(IPROUTE2_DIR)/Makefile + # For now disable compiling of the misc directory because it seems to fail + rm -rf $(IPROUTE2_DIR)/misc + $(SED) "s, misc,," $(IPROUTE2_DIR)/Makefile + touch $(IPROUTE2_DIR)/.configured + +$(IPROUTE2_DIR)/tc/tc: $(IPROUTE2_DIR)/.configured + $(MAKE) -C $(IPROUTE2_DIR) KERNEL_INCLUDE=$(LINUX_SOURCE_DIR)/include CC=$(TARGET_CC) AR=$(TARGET_AR) + +$(TARGET_DIR)/usr/sbin/tc: $(IPROUTE2_DIR)/tc/tc + # Copy The tc binary + cp -af $(IPROUTE2_DIR)/tc/tc $(TARGET_DIR)/usr/sbin/ + +iproute2: $(TARGET_DIR)/usr/sbin/tc + +iproute2-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(IPROUTE2_DIR) uninstall + -$(MAKE) -C $(IPROUTE2_DIR) clean + +iproute2-dirclean: + rm -rf $(IPROUTE2_DIR) + diff --git a/obsolete-buildroot/make/iptables.mk b/obsolete-buildroot/make/iptables.mk new file mode 100644 index 0000000000..886e54213d --- /dev/null +++ b/obsolete-buildroot/make/iptables.mk @@ -0,0 +1,51 @@ +############################################################# +# +# iptables +# +############################################################# +IPTABLES_SOURCE_URL=http://www.netfilter.org/files +IPTABLES_SOURCE=iptables-1.2.9.tar.bz2 +IPTABLES_BUILD_DIR=$(BUILD_DIR)/iptables-1.2.9 + +$(DL_DIR)/$(IPTABLES_SOURCE): + $(WGET) -P $(DL_DIR) $(IPTABLES_SOURCE_URL)/$(IPTABLES_SOURCE) + +$(IPTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(IPTABLES_SOURCE) + bzcat $(DL_DIR)/$(IPTABLES_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(IPTABLES_BUILD_DIR)/.unpacked + +$(IPTABLES_BUILD_DIR)/.configured: $(IPTABLES_BUILD_DIR)/.unpacked + # Allow patches. Needed for openwrt for instance. + $(SOURCE_DIR)/patch-kernel.sh $(IPTABLES_BUILD_DIR) $(SOURCE_DIR) iptables-*.patch + # + $(SED) "s;\[ -f /usr/include/netinet/ip6.h \];grep -q '__UCLIBC_HAS_IPV6__ 1' \ + $(BUILD_DIR)/uClibc/include/bits/uClibc_config.h;" $(IPTABLES_BUILD_DIR)/Makefile + touch $(IPTABLES_BUILD_DIR)/.configured + +$(IPTABLES_BUILD_DIR)/iptables: $(IPTABLES_BUILD_DIR)/.configured + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(IPTABLES_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" + +$(TARGET_DIR)/sbin/iptables: $(IPTABLES_BUILD_DIR)/iptables + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(IPTABLES_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" \ + DESTDIR=$(TARGET_DIR) install + $(STRIP) $(TARGET_DIR)/usr/sbin/iptables* + $(STRIP) $(TARGET_DIR)/usr/lib/iptables/*.so + rm -rf $(TARGET_DIR)/usr/man + +iptables: $(TARGET_DIR)/sbin/iptables + +iptables-source: $(DL_DIR)/$(IPTABLES_SOURCE) + +iptables-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(IPTABLES_BUILD_DIR) uninstall + -$(MAKE) -C $(IPTABLES_BUILD_DIR) clean + +iptables-dirclean: + rm -rf $(IPTABLES_BUILD_DIR) + diff --git a/obsolete-buildroot/make/jffs2root.mk b/obsolete-buildroot/make/jffs2root.mk new file mode 100644 index 0000000000..569ae7e39a --- /dev/null +++ b/obsolete-buildroot/make/jffs2root.mk @@ -0,0 +1,49 @@ +############################################################# +# +# mtd provides us with mkfs.jffs2, to target JFFS2 filesystems +# +############################################################# + +MTD_DIR:=$(BUILD_DIR)/mtd-20011217 +MTD_SOURCE=mtd_20011217.orig.tar.gz +MTD_SITE=http://ftp.debian.org/debian/pool/main/m/mtd +MKFS_JFFS2=$(shell which mkfs.jffs2 || echo $(MTD_DIR)/util/mkfs.jffs2) + +$(DL_DIR)/$(MTD_SOURCE): + $(WGET) -P $(DL_DIR) $(MTD_SITE)/$(MTD_SOURCE) + +$(MTD_DIR)/.unpacked: $(DL_DIR)/$(MTD_SOURCE) + zcat $(DL_DIR)/$(MTD_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MTD_DIR)/.unpacked + +$(MTD_DIR)/util/mkfs.jffs2: $(MTD_DIR)/.unpacked + CFLAGS=-I$(LINUX_DIR)/include $(MAKE) LINUXDIR=$(LINUX_DIR) -C $(MTD_DIR)/util + +mtd: $(MKFS_JFFS2) + + +############################################################# +# +# Build the jffs2 root filesystem image +# +############################################################# + +jffs2root: mtd + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + @rm -rf $(TARGET_DIR)/usr/man + @rm -rf $(TARGET_DIR)/usr/info + $(MKFS_JFFS2) --pad --little-endian --squash -e 0x20000 \ + -D $(SOURCE_DIR)/device_table.txt -d $(TARGET_DIR) \ + -o $(IMAGE) + +jffs2root-source: $(DL_DIR)/$(MTD_SOURCE) + +jffs2root-clean: + -$(MAKE) -C $(MTD_DIR) clean + +jffs2root-dirclean: + rm -rf $(MTD_DIR) + + + diff --git a/obsolete-buildroot/make/jpeg.mk b/obsolete-buildroot/make/jpeg.mk new file mode 100644 index 0000000000..d3f99676de --- /dev/null +++ b/obsolete-buildroot/make/jpeg.mk @@ -0,0 +1,73 @@ +############################################################# +# +# jpeg (libraries needed by some apps) +# +############################################################# +# Copyright (C) 2001-2003 by Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 +JPEG_DIR=$(BUILD_DIR)/jpeg-6b +JPEG_SITE:=ftp://ftp.uu.net/graphics/jpeg/ +JPEG_SOURCE=jpegsrc.v6b.tar.gz +JPEG_CAT:=zcat + +$(DL_DIR)/$(JPEG_SOURCE): + $(WGET) -P $(DL_DIR) $(JPEG_SITE)/$(JPEG_SOURCE) + +jpeg-source: $(DL_DIR)/$(JPEG_SOURCE) + +$(JPEG_DIR)/.unpacked: $(DL_DIR)/$(JPEG_SOURCE) + $(JPEG_CAT) $(DL_DIR)/$(JPEG_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # The config.guess distributed with the package is not able + # to handle cross compilation. Use the one from binutils. + cp $(BINUTILS_DIR)/config.guess $(JPEG_DIR)/ + touch $(JPEG_DIR)/.unpacked + +$(JPEG_DIR)/.configured: $(JPEG_DIR)/.unpacked + (cd $(JPEG_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --enable-shared \ + ); + touch $(JPEG_DIR)/.configured + +$(STAGING_DIR)/lib/libjpeg.so.62.0.0: $(JPEG_DIR)/.configured + $(MAKE) -C $(JPEG_DIR) all + # Note: This does not install the utilities. + $(MAKE) -C $(JPEG_DIR) prefix=$(STAGING_DIR) exec_prefix=$(STAGING_DIR) install-headers install-lib + +$(TARGET_DIR)/lib/libjpeg.so.62.0.0: $(STAGING_DIR)/lib/libjpeg.so.62.0.0 + cp -dpf $(STAGING_DIR)/lib/libjpeg.so* $(TARGET_DIR)/usr/lib/ + -$(STRIP) --strip-unneeded $(TARGET_DIR)/usr/lib/libjpeg.so.62.0.0 + +jpeg: uclibc $(TARGET_DIR)/lib/libjpeg.so.62.0.0 + +jpeg-clean: + -$(MAKE) -C $(JPEG_DIR) clean diff --git a/obsolete-buildroot/make/kernel-headers.mk b/obsolete-buildroot/make/kernel-headers.mk new file mode 100644 index 0000000000..2f8f950a67 --- /dev/null +++ b/obsolete-buildroot/make/kernel-headers.mk @@ -0,0 +1,85 @@ +############################################################# +# +# Setup the kernel headers. I include a generic package of +# kernel headers here, so you shouldn't need to include your +# own. Be aware these kernel headers _will_ get blown away +# by a 'make clean' so don't put anything sacred in here... +# +############################################################# +ifneq ($(filter $(TARGETS),kernel-headers),) + +VERSION=2 +PATCHLEVEL=4 +SUBLEVEL=25 +LINUX_SITE:=http://www.uclibc.org/downloads/toolchain +LINUX_SOURCE:=kernel-headers-2.4.25.tar.bz2 +LINUX_UNPACK_DIR:=$(TOOL_BUILD_DIR)/linux + + +# Uncomment this for 2.6.x kernel header files +#VERSION=2 +#PATCHLEVEL=6 +#SUBLEVEL=5 +#LINUX_SITE:=http://ep09.pld-linux.org/~mmazur/linux-libc-headers/ +#LINUX_SOURCE:=linux-libc-headers-2.6.5.0.tar.bz2 +#LINUX_UNPACK_DIR:=$(TOOL_BUILD_DIR)/linux-libc-headers-2.6.5.0 + + + +LINUX_DIR:=$(TOOL_BUILD_DIR)/linux + +$(DL_DIR)/$(LINUX_SOURCE): + $(WGET) -P $(DL_DIR) $(LINUX_SITE)/$(LINUX_SOURCE) + +$(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - +ifneq ($(LINUX_UNPACK_DIR),$(LINUX_DIR)) + mv $(LINUX_UNPACK_DIR) $(LINUX_DIR) +endif + touch $(LINUX_DIR)/.unpacked + +$(LINUX_DIR)/.configured: $(LINUX_DIR)/.unpacked + rm -f $(LINUX_DIR)/include/asm + @if [ ! -f $(LINUX_DIR)/Makefile ] ; then \ + echo -e "VERSION = $(VERSION)\nPATCHLEVEL = $(PATCHLEVEL)\n" > \ + $(LINUX_DIR)/Makefile; \ + echo -e "SUBLEVEL = $(SUBLEVEL)\nEXTRAVERSION =\n" > \ + $(LINUX_DIR)/Makefile; \ + echo -e "KERNELRELEASE=\$$(VERSION).\$$(PATCHLEVEL).\$$(SUBLEVEL)\$$(EXTRAVERSION)" >> \ + $(LINUX_DIR)/Makefile; \ + fi; + @if [ "$(ARCH)" = "powerpc" ];then \ + (cd $(LINUX_DIR)/include; ln -fs asm-ppc$(NOMMU) asm;) \ + elif [ "$(ARCH)" = "mips" ];then \ + (cd $(LINUX_DIR)/include; ln -fs asm-mips$(NOMMU) asm;) \ + elif [ "$(ARCH)" = "mipsel" ];then \ + (cd $(LINUX_DIR)/include; ln -fs asm-mips$(NOMMU) asm;) \ + elif [ "$(ARCH)" = "arm" ];then \ + (cd $(LINUX_DIR)/include; ln -fs asm-arm$(NOMMU) asm; \ + cd asm; \ + if [ ! -L proc ] ; then \ + ln -fs proc-armv proc; \ + ln -fs arch-ebsa285 arch; fi); \ + elif [ "$(ARCH)" = "cris" ];then \ + (cd $(LINUX_DIR)/include; ln -fs asm-cris asm;) \ + else \ + (cd $(LINUX_DIR)/include; ln -fs asm-$(ARCH)$(NOMMU) asm;) \ + fi + touch $(LINUX_DIR)/include/linux/autoconf.h; + touch $(LINUX_DIR)/.configured + +$(LINUX_KERNEL): $(LINUX_DIR)/.configured + +kernel-headers: $(LINUX_DIR)/.configured + +kernel-headers-source: $(DL_DIR)/$(LINUX_SOURCE) + +kernel-headers-clean: clean + rm -f $(LINUX_KERNEL) + rm -rf $(LINUX_DIR) + +kernel-headers-dirclean: + rm -rf $(LINUX_DIR) + +endif diff --git a/obsolete-buildroot/make/less.mk b/obsolete-buildroot/make/less.mk new file mode 100644 index 0000000000..af0ed4a3d3 --- /dev/null +++ b/obsolete-buildroot/make/less.mk @@ -0,0 +1,48 @@ +############################################################# +# +# less +# +############################################################# +LESS_SOURCE=less-381.tar.gz +LESS_SITE=http://www.greenwoodsoftware.com/less +LESS_DIR=$(BUILD_DIR)/less-381 +LESS_BINARY=less +LESS_TARGET_BINARY=usr/bin/less + +$(DL_DIR)/$(LESS_SOURCE): + $(WGET) -P $(DL_DIR) $(LESS_SITE)/$(LESS_SOURCE) + +$(LESS_DIR)/.source: $(DL_DIR)/$(LESS_SOURCE) + zcat $(DL_DIR)/$(LESS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(LESS_DIR)/.source + +$(LESS_DIR)/.configured: $(LESS_DIR)/.source + (cd $(LESS_DIR); \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --sysconfdir=/etc \ + ); + touch $(LESS_DIR)/.configured; + +$(LESS_DIR)/$(LESS_BINARY): $(LESS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(LESS_DIR) + +$(TARGET_DIR)/$(LESS_TARGET_BINARY): $(LESS_DIR)/$(LESS_BINARY) + $(MAKE) prefix=$(TARGET_DIR)/usr -C $(LESS_DIR) install + rm -Rf $(TARGET_DIR)/usr/man + +less: uclibc $(TARGET_DIR)/$(LESS_TARGET_BINARY) + +less-source: $(DL_DIR)/$(LESS_SOURCE) + +less-clean: + $(MAKE) prefix=$(TARGET_DIR)/usr -C $(LESS_DIR) uninstall + -$(MAKE) -C $(LESS_DIR) clean + +less-dirclean: + rm -rf $(LESS_DIR) + diff --git a/obsolete-buildroot/make/libfloat.mk b/obsolete-buildroot/make/libfloat.mk new file mode 100644 index 0000000000..dffef3de56 --- /dev/null +++ b/obsolete-buildroot/make/libfloat.mk @@ -0,0 +1,55 @@ +############################################################# +# +# libfloat +# +############################################################# +LIBFLOAT_SOURCE:=libfloat_990616.orig.tar.gz +LIBFLOAT_PATCH:=libfloat_990616-3.diff.gz +LIBFLOAT_SITE:=http://ftp.debian.org/debian/pool/main/libf/libfloat +LIBFLOAT_CAT:=zcat +LIBFLOAT_DIR:=$(BUILD_DIR)/libfloat + +LIBFLOAT_TARGET= +ifeq ($(strip $(SOFT_FLOAT)),true) +ifeq ("$(strip $(ARCH))","arm") +LIBFLOAT_TARGET+=$(STAGING_DIR)/lib/libfloat.so +endif +endif + +$(DL_DIR)/$(LIBFLOAT_SOURCE): + $(WGET) -P $(DL_DIR) $(LIBFLOAT_SITE)/$(LIBFLOAT_SOURCE) + +$(DL_DIR)/$(LIBFLOAT_PATCH): + $(WGET) -P $(DL_DIR) $(LIBFLOAT_SITE)/$(LIBFLOAT_PATCH) + +libfloat-source: $(DL_DIR)/$(LIBFLOAT_SOURCE) $(DL_DIR)/$(LIBFLOAT_PATCH) + +$(LIBFLOAT_DIR)/.unpacked: $(DL_DIR)/$(LIBFLOAT_SOURCE) $(DL_DIR)/$(LIBFLOAT_PATCH) + $(LIBFLOAT_CAT) $(DL_DIR)/$(LIBFLOAT_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # Remove the binary files distributed with the the package. + make -C $(LIBFLOAT_DIR) clean + $(SOURCE_DIR)/patch-kernel.sh $(LIBFLOAT_DIR) $(DL_DIR) $(LIBFLOAT_PATCH) + $(SOURCE_DIR)/patch-kernel.sh $(LIBFLOAT_DIR) $(SOURCE_DIR) libfloat.patch + touch $(LIBFLOAT_DIR)/.unpacked + +$(LIBFLOAT_DIR)/libfloat.so.1: $(LIBFLOAT_DIR)/.unpacked $(TARGET_CC) + $(MAKE) CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld -C $(LIBFLOAT_DIR) + +$(STAGING_DIR)/lib/libfloat.so: $(LIBFLOAT_DIR)/libfloat.so.1 + cp -a $(LIBFLOAT_DIR)/libfloat.a $(STAGING_DIR)/lib/libfloat.a + cp -a $(LIBFLOAT_DIR)/libfloat.so.1 $(STAGING_DIR)/lib/libfloat.so.1 + (cd $(STAGING_DIR)/lib ; ln -sf libfloat.so.1 libfloat.so) + cp -a $(LIBFLOAT_DIR)/libfloat.a $(TARGET_DIR)/usr/lib/libfloat.a + cp -a $(LIBFLOAT_DIR)/libfloat.so.1 $(TARGET_DIR)/lib/libfloat.so.1 + $(STRIP) $(TARGET_DIR)/lib/libfloat.so.1 > /dev/null 2>&1 + (cd $(TARGET_DIR)/lib ; ln -sf libfloat.so.1 libfloat.so) + (cd $(TARGET_DIR)/usr/lib ; ln -sf /lib/libfloat.so libfloat.so) + +libfloat: $(STAGING_DIR)/lib/libfloat.so + +libfloat-clean: + -$(MAKE) -C $(LIBFLOAT_DIR) clean + +libfloat-dirclean: + rm -rf $(LIBFLOAT_DIR) + diff --git a/obsolete-buildroot/make/libglib12.mk b/obsolete-buildroot/make/libglib12.mk new file mode 100644 index 0000000000..f6211ee107 --- /dev/null +++ b/obsolete-buildroot/make/libglib12.mk @@ -0,0 +1,79 @@ +############################################################# +# +# libglib1.2 +# +############################################################# +LIBGLIB12_SOURCE:=glib-1.2.10.tar.gz +LIBGLIB12_SITE:=ftp://ftp.gtk.org/pub/gtk/v1.2 +LIBGLIB12_CAT:=zcat +LIBGLIB12_DIR:=$(BUILD_DIR)/glib-1.2.10 +LIBGLIB12_BINARY:=libglib.a +LIBGLIB12_PATCH:=$(SOURCE_DIR)/libglib_configure_1.2.10.bz2 + + +$(DL_DIR)/$(LIBGLIB12_SOURCE): + $(WGET) -P $(DL_DIR) $(LIBGLIB12_SITE)/$(LIBGLIB12_SOURCE) + +libglib12-source: $(DL_DIR)/$(LIBGLIB12_SOURCE) + +$(LIBGLIB12_DIR)/.unpacked: $(DL_DIR)/$(LIBGLIB12_SOURCE) + $(LIBGLIB12_CAT) $(DL_DIR)/$(LIBGLIB12_SOURCE) | tar -C $(BUILD_DIR) -xvf - + bzcat $(LIBGLIB12_PATCH) | patch -p1 -d $(LIBGLIB12_DIR) + touch $(LIBGLIB12_DIR)/.unpacked + +$(LIBGLIB12_DIR)/.configured: $(LIBGLIB12_DIR)/.unpacked + (cd $(LIBGLIB12_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --enable-shared \ + ); + touch $(LIBGLIB12_DIR)/.configured + +$(LIBGLIB12_DIR)/.libs/$(LIBGLIB12_BINARY): $(LIBGLIB12_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(LIBGLIB12_DIR) + +$(STAGING_DIR)/lib/$(LIBGLIB12_BINARY): $(LIBGLIB12_DIR)/.libs/$(LIBGLIB12_BINARY) + $(MAKE) prefix=$(STAGING_DIR) \ + exec_prefix=$(STAGING_DIR) \ + bindir=$(STAGING_DIR)/bin \ + sbindir=$(STAGING_DIR)/sbin \ + libexecdir=$(STAGING_DIR)/libexec \ + datadir=$(STAGING_DIR)/share \ + sysconfdir=$(STAGING_DIR)/etc \ + sharedstatedir=$(STAGING_DIR)/com \ + localstatedir=$(STAGING_DIR)/var \ + libdir=$(STAGING_DIR)/lib \ + includedir=$(STAGING_DIR)/include \ + oldincludedir=$(STAGING_DIR)/include \ + infodir=$(STAGING_DIR)/info \ + mandir=$(STAGING_DIR)/man \ + -C $(LIBGLIB12_DIR) install; + +$(TARGET_DIR)/lib/$(LIBGLIB12_BINARY): $(STAGING_DIR)/lib/$(LIBGLIB12_BINARY) + cp -a $(STAGING_DIR)/lib/$(LIBGLIB12_BINARY) $(TARGET_DIR)/lib/ + cp -a $(STAGING_DIR)/lib/libglib.so $(TARGET_DIR)/lib/ + cp -a $(STAGING_DIR)/lib/libglib-1.2.so.0 $(TARGET_DIR)/lib/ + $(STRIP) --strip-unneeded $(TARGET_DIR)/lib/$(LIBGLIB12_BINARY) + +libglib12: uclibc $(TARGET_DIR)/lib/$(LIBGLIB12_BINARY) + +libglib12-clean: + rm -f $(TARGET_DIR)/lib/$(LIBGLIB12_BINARY) + -$(MAKE) -C $(LIBGLIB12_DIR) clean + +libglib12-dirclean: + rm -rf $(LIBGLIB12_DIR) + diff --git a/obsolete-buildroot/make/libmad.mk b/obsolete-buildroot/make/libmad.mk new file mode 100644 index 0000000000..fc077203cb --- /dev/null +++ b/obsolete-buildroot/make/libmad.mk @@ -0,0 +1,56 @@ +############################################################# +# +# libmad +# +############################################################# + +LIBMAD_VERSION=0.15.0b + +# Don't alter below this line unless you (think) you know +# what you are doing! Danger, Danger! + +LIBMAD_SOURCE=libmad-$(LIBMAD_VERSION).tar.gz +LIBMAD_SITE=http://easynews.dl.sourceforge.net/sourceforge/mad/ +LIBMAD_DIR=$(BUILD_DIR)/${shell basename $(LIBMAD_SOURCE) .tar.gz} +LIBMAD_WORKDIR=$(BUILD_DIR)/libmad-$(LIBMAD_VERSION) + +$(DL_DIR)/$(LIBMAD_SOURCE): + $(WGET) -P $(DL_DIR) $(LIBMAD_SITE)/$(LIBMAD_SOURCE) + +$(LIBMAD_DIR)/.unpacked: $(DL_DIR)/$(LIBMAD_SOURCE) + gzip -d -c $(DL_DIR)/$(LIBMAD_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(LIBMAD_DIR)/.unpacked + +$(LIBMAD_DIR)/.configured: $(LIBMAD_DIR)/.unpacked + (cd $(LIBMAD_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --sysconfdir=/etc \ + $(DISABLE_NLS) \ + ); + touch $(LIBMAD_DIR)/.configured + +$(LIBMAD_WORKDIR)/libmad: $(LIBMAD_DIR)/.configured + rm -f $@ + $(MAKE) CC=$(TARGET_CC) -C $(LIBMAD_WORKDIR) + +$(LIBMAD_WORKDIR)/.installed: $(LIBMAD_WORKDIR)/libmad + $(MAKE) prefix=$(TARGET_DIR)/usr -C $(LIBMAD_WORKDIR) install + touch $(LIBMAD_WORKDIR)/.installed + +libmad: uclibc $(LIBMAD_WORKDIR)/.installed + +libmad-source: $(DL_DIR)/$(LIBMAD_SOURCE) + +libmad-clean: + @if [ -d $(LIBMAD_WORKDIR)/Makefile ] ; then \ + $(MAKE) -C $(LIBMAD_WORKDIR) clean ; \ + fi; + +libmad-dirclean: + rm -rf $(LIBMAD_DIR) $(LIBMAD_WORKDIR) + diff --git a/obsolete-buildroot/make/libtool.mk b/obsolete-buildroot/make/libtool.mk new file mode 100644 index 0000000000..fbe1fb663f --- /dev/null +++ b/obsolete-buildroot/make/libtool.mk @@ -0,0 +1,77 @@ +############################################################# +# +# libtool +# +############################################################# +LIBTOOL_SOURCE:=libtool_1.4.3.orig.tar.gz +LIBTOOL_SITE:=http://ftp.debian.org/debian/pool/main/libt/libtool +LIBTOOL_CAT:=zcat +LIBTOOL_DIR:=$(BUILD_DIR)/libtool-1.4.3 +LIBTOOL_BINARY:=libtool +LIBTOOL_TARGET_BINARY:=usr/bin/libtool + +$(DL_DIR)/$(LIBTOOL_SOURCE): + $(WGET) -P $(DL_DIR) $(LIBTOOL_SITE)/$(LIBTOOL_SOURCE) + +libtool-source: $(DL_DIR)/$(LIBTOOL_SOURCE) + +$(LIBTOOL_DIR)/.unpacked: $(DL_DIR)/$(LIBTOOL_SOURCE) + $(LIBTOOL_CAT) $(DL_DIR)/$(LIBTOOL_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(LIBTOOL_DIR)/.unpacked + +$(LIBTOOL_DIR)/.configured: $(LIBTOOL_DIR)/.unpacked + (cd $(LIBTOOL_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(LIBTOOL_DIR)/.configured + +$(LIBTOOL_DIR)/$(LIBTOOL_BINARY): $(LIBTOOL_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(LIBTOOL_DIR) + touch -c $(LIBTOOL_DIR)/$(LIBTOOL_BINARY) + +$(TARGET_DIR)/$(LIBTOOL_TARGET_BINARY): $(LIBTOOL_DIR)/$(LIBTOOL_BINARY) + $(MAKE) \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + bindir=$(TARGET_DIR)/usr/bin \ + sbindir=$(TARGET_DIR)/usr/sbin \ + libexecdir=$(TARGET_DIR)/usr/lib \ + datadir=$(TARGET_DIR)/usr/share \ + sysconfdir=$(TARGET_DIR)/etc \ + localstatedir=$(TARGET_DIR)/var \ + libdir=$(TARGET_DIR)/usr/lib \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(TARGET_DIR)/usr/include \ + -C $(LIBTOOL_DIR) install; + $(STRIP) $(TARGET_DIR)//usr/lib/libltdl.so.*.*.* > /dev/null 2>&1 + $(SED) "s,^CC.*,CC=\"/usr/bin/gcc\"," $(TARGET_DIR)/usr/bin/libtool + $(SED) "s,^LD.*,LD=\"/usr/bin/ld\"," $(TARGET_DIR)/usr/bin/libtool + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +libtool: uclibc $(TARGET_DIR)/$(LIBTOOL_TARGET_BINARY) + +libtool-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(LIBTOOL_DIR) uninstall + -$(MAKE) -C $(LIBTOOL_DIR) clean + +libtool-dirclean: + rm -rf $(LIBTOOL_DIR) + diff --git a/obsolete-buildroot/make/links.mk b/obsolete-buildroot/make/links.mk new file mode 100644 index 0000000000..28c5a9cc40 --- /dev/null +++ b/obsolete-buildroot/make/links.mk @@ -0,0 +1,54 @@ +############################################################# +# +# links (text based web browser) +# +############################################################# +LINKS_SITE:=http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/links/download/no-ssl +LINKS_SOURCE:=links-0.99pre9-no-ssl.tar.gz +LINKS_DIR:=$(BUILD_DIR)/links-0.99pre9-no-ssl + +$(DL_DIR)/$(LINKS_SOURCE): + $(WGET) -P $(DL_DIR) $(LINKS_SITE)/$(LINKS_SOURCE) + +links-source: $(DL_DIR)/$(LINKS_SOURCE) + +$(LINKS_DIR)/.unpacked: $(DL_DIR)/$(LINKS_SOURCE) + zcat $(DL_DIR)/$(LINKS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(LINKS_DIR)/.unpacked + +$(LINKS_DIR)/.configured: $(LINKS_DIR)/.unpacked + (cd $(LINKS_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/tmp \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(LINKS_DIR)/.configured + +$(LINKS_DIR)/links: $(LINKS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(LINKS_DIR) + $(STRIP) $(LINKS_DIR)/links + +$(TARGET_DIR)/usr/bin/links: $(LINKS_DIR)/links + install -c $(LINKS_DIR)/links $(TARGET_DIR)/usr/bin/links + +links-clean: + $(MAKE) -C $(LINKS_DIR) clean + +links-dirclean: + rm -rf $(LINKS_DIR) + +links: uclibc $(TARGET_DIR)/usr/bin/links + diff --git a/obsolete-buildroot/make/linux.mk b/obsolete-buildroot/make/linux.mk new file mode 100644 index 0000000000..fcd808a7ae --- /dev/null +++ b/obsolete-buildroot/make/linux.mk @@ -0,0 +1,113 @@ +############################################################# +# +# Linux kernel targets +# +# Note: If you have any patches to apply, create the directory +# sources/kernel-patches and put your patches in there and number +# them in the order you wish to apply them... i.e. +# +# sources/kernel-patches/001-my-special-stuff.bz2 +# sources/kernel-patches/003-gcc-Os.bz2 +# sources/kernel-patches/004_no-warnings.bz2 +# sources/kernel-patches/030-lowlatency-mini.bz2 +# sources/kernel-patches/031-lowlatency-fixes-5.bz2 +# sources/kernel-patches/099-shutup.bz2 +# etc... +# +# these patches will all be applied by the patch-kernel.sh +# script (which will also abort the build if it finds rejects) +# -Erik +# +############################################################# +ifneq ($(filter $(TARGETS),linux),) + +# Version of Linux to download and then apply patches to +DOWNLOAD_LINUX_VERSION=2.4.25 +# Version of Linux AFTER patches +LINUX_VERSION=2.4.26-pre5-erik + +LINUX_FORMAT=bzImage +#LINUX_FORMAT=images/zImage.prep +LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \ + -e 's/mipsel/mips/' \ + -e 's/powerpc/ppc/' \ + -e 's/sh[234]/sh/' \ + ) +LINUX_BINLOC=arch/$(LINUX_KARCH)/boot/$(LINUX_FORMAT) + +LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION) +LINUX_SOURCE=linux-$(DOWNLOAD_LINUX_VERSION).tar.bz2 +LINUX_SITE=ftp://ftp.kernel.org/pub/linux/kernel/v2.4 +LINUX_KCONFIG=$(SOURCE_DIR)/linux.config +LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel +# Used by pcmcia-cs and others +LINUX_SOURCE_DIR=$(LINUX_DIR) + + +$(DL_DIR)/$(LINUX_SOURCE): + $(WGET) -P $(DL_DIR) $(LINUX_SITE)/$(LINUX_SOURCE) + +$(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE) + mkdir -p $(LINUX_DIR) $(TOOL_BUILD_DIR) + rm -rf $(LINUX_DIR) + bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) -xvf - +ifneq ($(DOWNLOAD_LINUX_VERSION),$(LINUX_VERSION)) + # Rename the dir from the downloaded version to the AFTER patch version + mv -f $(BUILD_DIR)/linux-$(DOWNLOAD_LINUX_VERSION) $(BUILD_DIR)/linux-$(LINUX_VERSION) +endif + mkdir -p $(SOURCE_DIR)/kernel-patches + $(SOURCE_DIR)/patch-kernel.sh $(LINUX_DIR) $(SOURCE_DIR)/kernel-patches + -(cd $(TOOL_BUILD_DIR); ln -sf $(LINUX_DIR) linux) + touch $(LINUX_DIR)/.unpacked + +$(LINUX_KCONFIG): + @if [ ! -f "$(LINUX_KCONFIG)" ] ; then \ + echo ""; \ + echo "You should create a .config for your kernel"; \ + echo "and install it as $(LINUX_KCONFIG)"; \ + echo ""; \ + sleep 5; \ + fi; + +$(LINUX_DIR)/.configured $(BUILD_DIR)/linux/.configured: $(LINUX_DIR)/.unpacked $(LINUX_KCONFIG) + $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/Makefile + -cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config + $(MAKE) -C $(LINUX_DIR) oldconfig include/linux/version.h + touch $(LINUX_DIR)/.configured + +$(LINUX_DIR)/.depend_done: $(LINUX_DIR)/.configured + $(MAKE) -C $(LINUX_DIR) dep + touch $(LINUX_DIR)/.depend_done + +$(LINUX_DIR)/$(LINUX_BINLOC): $(LINUX_DIR)/.depend_done + $(MAKE) -C $(LINUX_DIR) $(LINUX_FORMAT) + $(MAKE) -C $(LINUX_DIR) modules + +$(LINUX_KERNEL): $(LINUX_DIR)/$(LINUX_BINLOC) + cp -fa $(LINUX_DIR)/$(LINUX_BINLOC) $(LINUX_KERNEL) + touch -c $(LINUX_KERNEL) + +$(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep: $(LINUX_KERNEL) + rm -rf $(TARGET_DIR)/lib/modules + rm -f $(TARGET_DIR)/sbin/cardmgr + $(MAKE) -C $(LINUX_DIR) INSTALL_MOD_PATH=$(TARGET_DIR) modules_install + (cd $(TARGET_DIR)/lib/modules; ln -s $(LINUX_VERSION)/kernel/drivers .) + +$(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured + mkdir -p $(STAGING_DIR)/include + tar -ch -C $(LINUX_DIR)/include -f - linux | tar -xf - -C $(STAGING_DIR)/include/ + tar -ch -C $(LINUX_DIR)/include -f - asm | tar -xf - -C $(STAGING_DIR)/include/ + +linux: $(STAGING_DIR)/include/linux/version.h $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep + +linux-source: $(DL_DIR)/$(LINUX_SOURCE) + +# This has been renamed so we do _NOT_ by default run this on 'make clean' +linuxclean: clean + rm -f $(LINUX_KERNEL) + -$(MAKE) -C $(LINUX_DIR) clean + +linux-dirclean: + rm -rf $(LINUX_DIR) + +endif diff --git a/obsolete-buildroot/make/lrzsz.mk b/obsolete-buildroot/make/lrzsz.mk new file mode 100644 index 0000000000..222d64a712 --- /dev/null +++ b/obsolete-buildroot/make/lrzsz.mk @@ -0,0 +1,76 @@ +############################################################# +# +# lrzsz (provides zmodem) +# +############################################################# +# Copyright (C) 2001-2003 by Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + +LRZSZ_SITE:=http://www.ohse.de/uwe/releases +LRZSZ_SOURCE:=lrzsz-0.12.20.tar.gz +LRZSZ_DIR:=$(BUILD_DIR)/lrzsz-0.12.20 + +$(DL_DIR)/$(LRZSZ_SOURCE): + $(WGET) -P $(DL_DIR) $(LRZSZ_SITE)/$(LRZSZ_SOURCE) + +lrzsz-source: $(DL_DIR)/$(LRZSZ_SOURCE) + +$(LRZSZ_DIR)/.unpacked: $(DL_DIR)/$(LRZSZ_SOURCE) + zcat $(DL_DIR)/$(LRZSZ_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(LRZSZ_DIR)/.unpacked + +$(LRZSZ_DIR)/.configured: $(LRZSZ_DIR)/.unpacked + (cd $(LRZSZ_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/tmp \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --disable-timesync \ + ); + $(SED) "s/-lnsl//;" $(LRZSZ_DIR)/src/Makefile + $(SED) "s~\(#define ENABLE_SYSLOG.*\)~/* \1 */~;" $(LRZSZ_DIR)/config.h + touch $(LRZSZ_DIR)/.configured + +$(LRZSZ_DIR)/src/lrz: $(LRZSZ_DIR)/.configured + $(MAKE) CROSS_COMPILE="$(TARGET_CROSS)" prefix="$(TARGET_DIR)" -C $(LRZSZ_DIR) + $(STRIP) $(LRZSZ_DIR)/src/lrz $(LRZSZ_DIR)/src/lsz + +$(TARGET_DIR)/usr/bin/rz: $(LRZSZ_DIR)/src/lrz + cp $(LRZSZ_DIR)/src/lrz $(TARGET_DIR)/usr/bin/rz + cp $(LRZSZ_DIR)/src/lsz $(TARGET_DIR)/usr/bin/sz + +lrzsz: uclibc $(TARGET_DIR)/usr/bin/rz + +lrzsz-clean: + rm -f $(TARGET_DIR)/usr/bin/rz + -$(MAKE) -C $(LRZSZ_DIR) clean + +lrzsz-dirclean: + rm -rf $(LRZSZ_DIR) diff --git a/obsolete-buildroot/make/ltp-testsuite.mk b/obsolete-buildroot/make/ltp-testsuite.mk new file mode 100644 index 0000000000..cb4a0161d1 --- /dev/null +++ b/obsolete-buildroot/make/ltp-testsuite.mk @@ -0,0 +1,39 @@ +############################################################# +# +# ltp-testsuite +# +############################################################# +LTP_TESTSUITE_SOURCE:=ltp-full-20040206.tgz +LTP_TESTSUITE_SITE:=http://aleron.dl.sourceforge.net/sourceforge/ltp +LTP_TESTSUITE_CAT:=zcat +LTP_TESTSUITE_DIR:=$(BUILD_DIR)/ltp-full-20040206 +LTP_TESTSUITE_PATCH:=$(SOURCE_DIR)/ltp-testsuite.patch + + +$(DL_DIR)/$(LTP_TESTSUITE_SOURCE): + $(WGET) -P $(DL_DIR) $(LTP_TESTSUITE_SITE)/$(LTP_TESTSUITE_SOURCE) + +ltp-testsuite-source: $(DL_DIR)/$(LTP_TESTSUITE_SOURCE) + +$(LTP_TESTSUITE_DIR)/.unpacked: $(DL_DIR)/$(LTP_TESTSUITE_SOURCE) + $(LTP_TESTSUITE_CAT) $(DL_DIR)/$(LTP_TESTSUITE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(LTP_TESTSUITE_PATCH) | patch -p1 -d $(LTP_TESTSUITE_DIR) + touch $(LTP_TESTSUITE_DIR)/.unpacked + +$(LTP_TESTSUITE_DIR)/ltp-testsuite: $(LTP_TESTSUITE_DIR)/.unpacked + $(MAKE) $(TARGET_CONFIGURE_OPTS) CROSS_COMPILER=$(TARGET_CROSS) \ + -C $(LTP_TESTSUITE_DIR) + +$(TARGET_DIR)/usr/bin/ltp-testsuite: $(LTP_TESTSUITE_DIR)/ltp-testsuite + $(MAKE) $(TARGET_CONFIGURE_OPTS) CROSS_COMPILER=$(TARGET_CROSS) \ + -C $(LTP_TESTSUITE_DIR) install + +ltp-testsuite: uclibc $(TARGET_DIR)/usr/bin/ltp-testsuite + +ltp-testsuite-clean: + $(MAKE) -C $(LTP_TESTSUITE_DIR) clean + +ltp-testsuite-dirclean: + rm -rf $(LTP_TESTSUITE_DIR) + + diff --git a/obsolete-buildroot/make/ltrace.mk b/obsolete-buildroot/make/ltrace.mk new file mode 100644 index 0000000000..9b41626e08 --- /dev/null +++ b/obsolete-buildroot/make/ltrace.mk @@ -0,0 +1,48 @@ +############################################################# +# +# ltrace +# +############################################################# +LTRACE_SOURCE=ltrace_0.3.31.tar.gz +LTRACE_SITE=http://ftp.debian.org/debian/pool/main/l/ltrace +LTRACE_DIR=$(BUILD_DIR)/ltrace-0.3.31 +LTRACE_BINARY=ltrace +LTRACE_TARGET_BINARY=usr/bin/ltrace + +$(DL_DIR)/$(LTRACE_SOURCE): + $(WGET) -P $(DL_DIR) $(LTRACE_SITE)/$(LTRACE_SOURCE) + +$(LTRACE_DIR)/.source: $(DL_DIR)/$(LTRACE_SOURCE) + zcat $(DL_DIR)/$(LTRACE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(LTRACE_DIR)/.source + +$(LTRACE_DIR)/.configured: $(LTRACE_DIR)/.source + (cd $(LTRACE_DIR); \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --sysconfdir=/etc \ + ); + touch $(LTRACE_DIR)/.configured; + +$(LTRACE_DIR)/$(LTRACE_BINARY): $(LTRACE_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(LTRACE_DIR) + +$(TARGET_DIR)/$(LTRACE_TARGET_BINARY): $(LTRACE_DIR)/$(LTRACE_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(LTRACE_DIR) install + rm -Rf $(TARGET_DIR)/usr/man + +ltrace: uclibc $(TARGET_DIR)/$(LTRACE_TARGET_BINARY) + +ltrace-source: $(DL_DIR)/$(LTRACE_SOURCE) + +ltrace-clean: + $(MAKE) prefix=$(TARGET_DIR)/usr -C $(LTRACE_DIR) uninstall + -$(MAKE) -C $(LTRACE_DIR) clean + +ltrace-dirclean: + rm -rf $(LTRACE_DIR) + diff --git a/obsolete-buildroot/make/lzo.mk b/obsolete-buildroot/make/lzo.mk new file mode 100644 index 0000000000..48e9d7b5db --- /dev/null +++ b/obsolete-buildroot/make/lzo.mk @@ -0,0 +1,65 @@ +############################################################# +# +# lzo +# +# Note: this builds only a static library, it does not provide +# anything to be installed into the target system. +# +############################################################# +LZO_SOURCE:=lzo_1.08.orig.tar.gz +LZO_SITE:=http://ftp.debian.org/debian/pool/main/l/lzo +#LZO_SOURCE:=lzo-1.08.tar.bz2 +#LZO_SITE:=http://www.oberhumer.com/opensource/lzo/download +LZO_DIR:=$(BUILD_DIR)/lzo-1.08 +LZO_CAT:=zcat +LZO_PATCH:=$(SOURCE_DIR)/lzo-cross-compile.patch + +$(DL_DIR)/$(LZO_SOURCE): + $(WGET) -P $(DL_DIR) $(LZO_SITE)/$(LZO_SOURCE) + +lzo-source: $(DL_DIR)/$(LZO_SOURCE) + +$(LZO_DIR)/.unpacked: $(DL_DIR)/$(LZO_SOURCE) + $(LZO_CAT) $(DL_DIR)/$(LZO_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(LZO_PATCH) | patch -p1 -d $(LZO_DIR) + touch $(LZO_DIR)/.unpacked + +LZO_CONFIG_SHARED:=--disable-shared +#LZO_CONFIG_SHARED:=--enable-shared + +$(LZO_DIR)/.configured: $(LZO_DIR)/.unpacked + (cd $(LZO_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(LZO_CONFIG_SHARED) \ + ); + touch $(LZO_DIR)/.configured + +$(LZO_DIR)/src/liblzo.la: $(LZO_DIR)/.configured + $(MAKE) -C $(LZO_DIR) + +$(STAGING_DIR)/lib/liblzo.a: $(LZO_DIR)/src/liblzo.la + $(MAKE) CC=$(TARGET_CC) DESTDIR=$(STAGING_DIR) -C $(LZO_DIR) install + +lzo: uclibc $(STAGING_DIR)/lib/liblzo.a + +lzo-clean: + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(LZO_DIR) uninstall + -$(MAKE) -C $(LZO_DIR) clean + +lzo-dirclean: + rm -rf $(LZO_DIR) + diff --git a/obsolete-buildroot/make/m4.mk b/obsolete-buildroot/make/m4.mk new file mode 100644 index 0000000000..5a09889729 --- /dev/null +++ b/obsolete-buildroot/make/m4.mk @@ -0,0 +1,65 @@ +############################################################# +# +# m4 +# +############################################################# +M4_SOURCE:=m4-1.4.tar.gz +M4_SITE:=ftp://ftp.gnu.org/gnu/m4 +M4_CAT:=zcat +M4_DIR:=$(BUILD_DIR)/m4-1.4 +M4_BINARY:=m4 +M4_TARGET_BINARY:=usr/bin/m4 + +$(DL_DIR)/$(M4_SOURCE): + $(WGET) -P $(DL_DIR) $(M4_SITE)/$(M4_SOURCE) + +m4-source: $(DL_DIR)/$(M4_SOURCE) + +$(M4_DIR)/.unpacked: $(DL_DIR)/$(M4_SOURCE) + $(M4_CAT) $(DL_DIR)/$(M4_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(M4_DIR)/.unpacked + +$(M4_DIR)/.configured: $(M4_DIR)/.unpacked + (cd $(M4_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + ); + touch $(M4_DIR)/.configured + +$(M4_DIR)/src/$(M4_BINARY): $(M4_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(M4_DIR) + +$(TARGET_DIR)/$(M4_TARGET_BINARY): $(M4_DIR)/src/$(M4_BINARY) + $(MAKE) \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + bindir=$(TARGET_DIR)/usr/bin \ + sbindir=$(TARGET_DIR)/usr/sbin \ + libexecdir=$(TARGET_DIR)/usr/lib \ + datadir=$(TARGET_DIR)/usr/share \ + sysconfdir=$(TARGET_DIR)/etc \ + localstatedir=$(TARGET_DIR)/var \ + libdir=$(TARGET_DIR)/usr/lib \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(TARGET_DIR)/usr/include \ + -C $(M4_DIR) install; + $(STRIP) $(TARGET_DIR)/$(M4_TARGET_BINARY) > /dev/null 2>&1 + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +m4: uclibc $(TARGET_DIR)/$(M4_TARGET_BINARY) + +m4-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(M4_DIR) uninstall + -$(MAKE) -C $(M4_DIR) clean + +m4-dirclean: + rm -rf $(M4_DIR) + diff --git a/obsolete-buildroot/make/make.mk b/obsolete-buildroot/make/make.mk new file mode 100644 index 0000000000..ec508fed3b --- /dev/null +++ b/obsolete-buildroot/make/make.mk @@ -0,0 +1,61 @@ +############################################################# +# +# make +# +############################################################# +GNUMAKE_SOURCE:=make-3.80.tar.bz2 +GNUMAKE_SITE:=ftp://ftp.gnu.org/gnu/make +GNUMAKE_DIR:=$(BUILD_DIR)/make-3.80 +GNUMAKE_CAT:=bzcat +GNUMAKE_BINARY:=make +GNUMAKE_TARGET_BINARY:=usr/bin/make + +$(DL_DIR)/$(GNUMAKE_SOURCE): + $(WGET) -P $(DL_DIR) $(GNUMAKE_SITE)/$(GNUMAKE_SOURCE) + +make-source: $(DL_DIR)/$(GNUMAKE_SOURCE) + +$(GNUMAKE_DIR)/.unpacked: $(DL_DIR)/$(GNUMAKE_SOURCE) + $(GNUMAKE_CAT) $(DL_DIR)/$(GNUMAKE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(GNUMAKE_DIR)/.unpacked + +$(GNUMAKE_DIR)/.configured: $(GNUMAKE_DIR)/.unpacked + (cd $(GNUMAKE_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(GNUMAKE_DIR)/.configured + +$(GNUMAKE_DIR)/$(GNUMAKE_BINARY): $(GNUMAKE_DIR)/.configured + $(MAKE) -C $(GNUMAKE_DIR) + +$(TARGET_DIR)/$(GNUMAKE_TARGET_BINARY): $(GNUMAKE_DIR)/$(GNUMAKE_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GNUMAKE_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +make: uclibc $(TARGET_DIR)/$(GNUMAKE_TARGET_BINARY) + +make-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GNUMAKE_DIR) uninstall + -$(MAKE) -C $(GNUMAKE_DIR) clean + +make-dirclean: + rm -rf $(GNUMAKE_DIR) + diff --git a/obsolete-buildroot/make/microcom.mk b/obsolete-buildroot/make/microcom.mk new file mode 100644 index 0000000000..bf01cf3d7f --- /dev/null +++ b/obsolete-buildroot/make/microcom.mk @@ -0,0 +1,59 @@ +############################################################# +# +# microcom terminal emulator +# +# Maintainer: Tim Riker +# +############################################################# +# Copyright (C) 2001-2003 by Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + +# TARGETS +# http://microcom.port5.com/m102.tar.gz +MICROCOM_SITE:=http://microcom.port5.com/ +MICROCOM_SOURCE:=m102.tar.gz +MICROCOM_DIR:=$(BUILD_DIR)/microcom-1.02 + +$(DL_DIR)/$(MICROCOM_SOURCE): + $(WGET) -P $(DL_DIR) $(MICROCOM_SITE)/$(MICROCOM_SOURCE) + +microcom-source: $(DL_DIR)/$(MICROCOM_SOURCE) + +$(MICROCOM_DIR)/.unpacked: $(DL_DIR)/$(MICROCOM_SOURCE) + mkdir -p $(MICROCOM_DIR) + zcat $(DL_DIR)/$(MICROCOM_SOURCE) | tar -C $(MICROCOM_DIR) -xvf - + touch $(MICROCOM_DIR)/.unpacked + +$(MICROCOM_DIR)/.configured: $(MICROCOM_DIR)/.unpacked + $(SED) 's~gcc~${TARGET_CC}~' $(MICROCOM_DIR)/Makefile + touch $(MICROCOM_DIR)/.configured + +$(MICROCOM_DIR)/microcom: $(MICROCOM_DIR)/.configured + $(MAKE) -C $(MICROCOM_DIR) + +$(TARGET_DIR)/usr/bin/microcom: $(MICROCOM_DIR)/microcom + install -c $(MICROCOM_DIR)/microcom $(TARGET_DIR)/usr/bin/microcom + +microcom-clean: + rm $(MICROCOM_DIR)/*.o + +microcom-dirclean: + rm -rf $(MICROCOM_DIR) + +microcom: uclibc $(TARGET_DIR)/usr/bin/microcom + diff --git a/obsolete-buildroot/make/microwin.mk b/obsolete-buildroot/make/microwin.mk new file mode 100644 index 0000000000..e59600f39b --- /dev/null +++ b/obsolete-buildroot/make/microwin.mk @@ -0,0 +1,46 @@ +############################################################# +# +# Microwindows - 2003/11/17 Greg Haerr +# (requires CVS 2003/11/17 or later) +# +############################################################# +MICROWIN_SITE:=ftp://ftp.microwindows.org/pub/microwindows +MICROWIN_SOURCE:=microwindows-src-snapshot.tar.gz +MICROWIN_DIR:=$(BUILD_DIR)/microwin +#MICROWIN_SOURCE:=microwindows-0.91.tar.gz +#MICROWIN_DIR:=$(BUILD_DIR)/microwindows-0.91 + +MICROWIN_CAT:=zcat +MICROWIN_BINARY:=$(MICROWIN_DIR)/src/bin/nano-X +MICROWIN_TARGET_BINARY:=$(TARGET_DIR)/usr/bin/nano-X + +MICROWIN_CONFIG:=$(MICROWIN_DIR)/src/Configs/config.uclibc + +$(DL_DIR)/$(MICROWIN_SOURCE): + $(WGET) -P $(DL_DIR) $(MICROWIN_SITE)/$(MICROWIN_SOURCE) + +microwin-source: $(DL_DIR)/$(MICROWIN_SOURCE) + +$(MICROWIN_DIR)/.unpacked: $(DL_DIR)/$(MICROWIN_SOURCE) + $(MICROWIN_CAT) $(DL_DIR)/$(MICROWIN_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MICROWIN_DIR)/.unpacked + +$(MICROWIN_DIR)/.configured: $(MICROWIN_DIR)/.unpacked + (cd $(MICROWIN_DIR); \ + ); + touch $(MICROWIN_DIR)/.configured + +$(MICROWIN_BINARY): $(MICROWIN_DIR)/.configured + $(MAKE) ARCH=LINUX-$(shell echo $(ARCH) | tr a-z A-Z) $(shell echo $(ARCH) | tr a-z A-Z)TOOLSPREFIX=$(TARGET_CROSS) CC=$(TARGET_CC) -C $(MICROWIN_DIR)/src CONFIG=$(MICROWIN_CONFIG) + +$(MICROWIN_TARGET_BINARY): $(MICROWIN_BINARY) + $(MAKE) INSTALL_PREFIX=$(TARGET_DIR)/usr INSTALL_OWNER1= INSTALL_OWNER2= CC=$(TARGET_CC) -C $(MICROWIN_DIR)/src CONFIG=$(MICROWIN_CONFIG) install + +microwin: uclibc $(MICROWIN_TARGET_BINARY) + +microwin-clean: + -$(MAKE) -C $(MICROWIN_DIR)/src clean + +microwin-dirclean: + rm -rf $(MICROWIN_DIR) + diff --git a/obsolete-buildroot/make/mkdosfs.mk b/obsolete-buildroot/make/mkdosfs.mk new file mode 100644 index 0000000000..98288afed3 --- /dev/null +++ b/obsolete-buildroot/make/mkdosfs.mk @@ -0,0 +1,44 @@ +############################################################# +# +# mkdosfs +# +############################################################# +MKDOSFS_SOURCE=dosfstools-2.8.src.tar.gz +MKDOSFS_SITE=http://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools +MKDOSFS_DIR=$(BUILD_DIR)/dosfstools-2.8 +MKDOSFS_CAT:=zcat +MKDOSFS_BINARY:=mkdosfs/mkdosfs +MKDOSFS_TARGET_BINARY:=sbin/mkdosfs +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +MKDOSFS_CFLAGS="-Os -g -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" +else +MKDOSFS_CFLAGS="-Os -g" +endif + +$(DL_DIR)/$(MKDOSFS_SOURCE): + $(WGET) -P $(DL_DIR) $(MKDOSFS_SITE)/$(MKDOSFS_SOURCE) + +mkdosfs-source: $(DL_DIR)/$(MKDOSFS_SOURCE) + +$(MKDOSFS_DIR)/.unpacked: $(DL_DIR)/$(MKDOSFS_SOURCE) + $(MKDOSFS_CAT) $(DL_DIR)/$(MKDOSFS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MKDOSFS_DIR)/.unpacked + +$(MKDOSFS_DIR)/$(MKDOSFS_BINARY): $(MKDOSFS_DIR)/.unpacked + $(MAKE) CFLAGS=$(MKDOSFS_CFLAGS) CC=$(TARGET_CC) -C $(MKDOSFS_DIR); + $(STRIP) $(MKDOSFS_DIR)/mkdosfs/mkdosfs; + touch -c $(MKDOSFS_DIR)/mkdosfs/mkdosfs + +$(TARGET_DIR)/$(MKDOSFS_TARGET_BINARY): $(MKDOSFS_DIR)/$(MKDOSFS_BINARY) + cp -a $(MKDOSFS_DIR)/$(MKDOSFS_BINARY) $(TARGET_DIR)/$(MKDOSFS_TARGET_BINARY) + touch -c $(TARGET_DIR)/sbin/mkdosfs + +mkdosfs: uclibc $(TARGET_DIR)/$(MKDOSFS_TARGET_BINARY) + +mkdosfs-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(MKDOSFS_DIR) uninstall + -$(MAKE) -C $(MKDOSFS_DIR) clean + +mkdosfs-dirclean: + rm -rf $(MKDOSFS_DIR) + diff --git a/obsolete-buildroot/make/mke2fs.mk b/obsolete-buildroot/make/mke2fs.mk new file mode 100644 index 0000000000..6168cfaed4 --- /dev/null +++ b/obsolete-buildroot/make/mke2fs.mk @@ -0,0 +1,71 @@ +############################################################# +# +# mke2fs +# +############################################################# +MKE2FS_SOURCE=e2fsprogs-1.27.tar.gz +MKE2FS_SITE=http://aleron.dl.sourceforge.net/sourceforge/e2fsprogs +MKE2FS_DIR=$(BUILD_DIR)/e2fsprogs-1.27 +MKE2FS_CAT:=zcat +MKE2FS_BINARY:=misc/mke2fs +MKE2FS_TARGET_BINARY:=sbin/mke2fs + +$(DL_DIR)/$(MKE2FS_SOURCE): + $(WGET) -P $(DL_DIR) $(MKE2FS_SITE)/$(MKE2FS_SOURCE) + +mke2fs-source: $(DL_DIR)/$(MKE2FS_SOURCE) + +$(MKE2FS_DIR)/.unpacked: $(DL_DIR)/$(MKE2FS_SOURCE) + $(MKE2FS_CAT) $(DL_DIR)/$(MKE2FS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MKE2FS_DIR)/.unpacked + +$(MKE2FS_DIR)/.configured: $(MKE2FS_DIR)/.unpacked + (cd $(MKE2FS_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --with-cc=$(TARGET_CC) \ + --with-linker=$(TARGET_CROSS)ld \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --disable-elf-shlibs --disable-swapfs \ + --disable-debugfs --disable-imager \ + --disable-resizer --disable-fsck \ + --without-catgets $(DISABLE_NLS) \ + ); + touch $(MKE2FS_DIR)/.configured + +$(MKE2FS_DIR)/$(MKE2FS_BINARY): $(MKE2FS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(MKE2FS_DIR) + $(STRIP) $(MKE2FS_DIR)/misc/mke2fs $(MKE2FS_DIR)/misc/badblocks; + touch -c $(MKE2FS_DIR)/misc/mke2fs + +$(TARGET_DIR)/$(MKE2FS_TARGET_BINARY): $(MKE2FS_DIR)/$(MKE2FS_BINARY) + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(MKE2FS_DIR) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Only install a few selected items... + cp -dpf $(MKE2FS_DIR)/misc/mke2fs $(TARGET_DIR)/sbin/mke2fs; + cp -dpf $(MKE2FS_DIR)/misc/badblocks $(TARGET_DIR)/sbin/badblocks; + touch -c $(TARGET_DIR)/sbin/mke2fs + +mke2fs: uclibc $(TARGET_DIR)/$(MKE2FS_TARGET_BINARY) + +mke2fs-clean: + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(MKE2FS_DIR) uninstall + rm -f $(TARGET_DIR)/sbin/mke2fs $(TARGET_DIR)/sbin/badblocks; + -$(MAKE) -C $(MKE2FS_DIR) clean + +mke2fs-dirclean: + rm -rf $(MKE2FS_DIR) + diff --git a/obsolete-buildroot/make/mpg123.mk b/obsolete-buildroot/make/mpg123.mk new file mode 100644 index 0000000000..796db7f79f --- /dev/null +++ b/obsolete-buildroot/make/mpg123.mk @@ -0,0 +1,45 @@ +############################################################# +# +# mpg123 +# +############################################################# + +MPG123_VERSION=0.59r + +# Don't alter below this line unless you (think) you know +# what you are doing! Danger, Danger! + +MPG123_SOURCE=mpg123-$(MPG123_VERSION).tar.gz +MPG123_SITE=http://www.mpg123.de/mpg123 +MPG123_DIR=$(BUILD_DIR)/${shell basename $(MPG123_SOURCE) .tar.gz} +MPG123_WORKDIR=$(BUILD_DIR)/mpg123-$(MPG123_VERSION) + +$(DL_DIR)/$(MPG123_SOURCE): + $(WGET) -P $(DL_DIR) $(MPG123_SITE)/$(MPG123_SOURCE) + +$(MPG123_DIR)/.unpacked: $(DL_DIR)/$(MPG123_SOURCE) + gzip -d -c $(DL_DIR)/$(MPG123_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MPG123_DIR)/.unpacked + +$(MPG123_WORKDIR)/mpg123: $(MPG123_DIR)/.unpacked + rm -f $@ + $(MAKE) CC=$(TARGET_CC) -C $(MPG123_WORKDIR) linux + +$(MPG123_WORKDIR)/.installed: $(MPG123_WORKDIR)/mpg123 + mkdir -p $(TARGET_DIR)/usr/bin + cp -f $(MPG123_WORKDIR)/mpg123 $(TARGET_DIR)/usr/bin + $(STRIP) --strip-all $(TARGET_DIR)/usr/bin/mpg123 + touch $(MPG123_WORKDIR)/.installed + +mpg123: uclibc libmad $(MPG123_WORKDIR)/.installed + +mpg123-source: $(DL_DIR)/$(MPG123_SOURCE) + +mpg123-clean: + @if [ -d $(MPG123_WORKDIR)/Makefile ] ; then \ + $(MAKE) -C $(MPG123_WORKDIR) clean ; \ + fi; + +mpg123-dirclean: + rm -rf $(MPG123_DIR) $(MPG123_WORKDIR) + diff --git a/obsolete-buildroot/make/mrouted.mk b/obsolete-buildroot/make/mrouted.mk new file mode 100644 index 0000000000..13a4f8c720 --- /dev/null +++ b/obsolete-buildroot/make/mrouted.mk @@ -0,0 +1,45 @@ +############################################################# +# +# mrouted +# +# +############################################################# +MROUTED_SOURCE:=mrouted_3.9-beta3.orig.tar.gz +MROUTED_SITE:=http://ftp.debian.org/debian/pool/non-free/m/mrouted +MROUTED_DIR:=$(BUILD_DIR)/mrouted-3.9-beta3.orig +MROUTED_CAT:=zcat +#MROUTED_PATCH:=$(SOURCE_DIR)/mrouted_3.9-beta3-1.1.diff +MROUTED_PATCH:=mrouted_3.9-beta3-1.1.diff.gz +MROUTED_BINARY:=mrouted +MROUTED_TARGET_BINARY:=usr/sbin/mrouted + +$(DL_DIR)/$(MROUTED_SOURCE): + $(WGET) -P $(DL_DIR) $(MROUTED_SITE)/$(MROUTED_SOURCE) + +$(DL_DIR)/$(MROUTED_PATCH): + $(WGET) -P $(DL_DIR) $(MROUTED_SITE)/$(MROUTED_PATCH) + +mrouted-source: $(DL_DIR)/$(MROUTED_SOURCE) $(DL_DIR)/$(MROUTED_PATCH) + +$(MROUTED_DIR)/.unpacked: mrouted-source + $(MROUTED_CAT) $(DL_DIR)/$(MROUTED_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(MROUTED_CAT) $(DL_DIR)/$(MROUTED_PATCH) | patch -p1 -d $(MROUTED_DIR) + $(SOURCE_DIR)/patch-kernel.sh $(MROUTED_DIR) $(SOURCE_DIR) mrouted-*.patch + touch $(MROUTED_DIR)/.unpacked + +$(MROUTED_DIR)/$(MROUTED_BINARY): $(MROUTED_DIR)/.unpacked + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) CC=$(TARGET_CC) -C $(MROUTED_DIR) + +$(TARGET_DIR)/$(MROUTED_TARGET_BINARY): $(MROUTED_DIR)/$(MROUTED_BINARY) + cp -a $(MROUTED_DIR)/$(MROUTED_BINARY) $(TARGET_DIR)/$(MROUTED_TARGET_BINARY) + +mrouted: uclibc $(TARGET_DIR)/$(MROUTED_TARGET_BINARY) + +mrouted-clean: + rm -f $(TARGET_DIR)/$(MROUTED_TARGET_BINARY) + -$(MAKE) -C $(MROUTED_DIR) clean + +mrouted-dirclean: + rm -rf $(MROUTED_DIR) + diff --git a/obsolete-buildroot/make/ncurses.mk b/obsolete-buildroot/make/ncurses.mk new file mode 100644 index 0000000000..f0e91271c5 --- /dev/null +++ b/obsolete-buildroot/make/ncurses.mk @@ -0,0 +1,133 @@ +############################################################# +# +# ncurses +# this installs only a few vital termcap entries +# +############################################################# +# Copyright (C) 2002 by Ken Restivo +# $Id$ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + +# TARGETS +NCURSES_SITE:=ftp://ftp.gnu.org/pub/gnu/ncurses +NCURSES_DIR:=$(BUILD_DIR)/ncurses-5.2 +NCURSES_SOURCE:=ncurses-5.2.tar.gz + +$(DL_DIR)/$(NCURSES_SOURCE): + $(WGET) -P $(DL_DIR) $(NCURSES_SITE)/$(NCURSES_SOURCE) + +$(NCURSES_DIR)/.dist: $(DL_DIR)/$(NCURSES_SOURCE) + gunzip -c $(DL_DIR)/$(NCURSES_SOURCE) | tar -C $(BUILD_DIR) -xvf - + #use the local tic and not whatever the build system was going to find. + $(SED) 's~\$$srcdir/shlib tic\$$suffix~/usr/bin/tic~' \ + $(NCURSES_DIR)/misc/run_tic.in + touch $(NCURSES_DIR)/.dist + +$(NCURSES_DIR)/.configured: $(NCURSES_DIR)/.dist + (cd $(NCURSES_DIR); rm -rf config.cache; \ + BUILD_CC=$(TARGET_CC) HOSTCC=$(HOSTCC) \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --with-terminfo-dirs=/usr/share/terminfo \ + --with-default-terminfo-dir=/usr/share/terminfo \ + --libdir=$(STAGING_DIR)/lib \ + --with-shared --without-cxx --without-cxx-binding \ + --without-ada --without-progs $(DISABLE_NLS) \ + --without-profile --without-debug --disable-rpath \ + --enable-echo --enable-const --enable-overwrite \ + ); + touch $(NCURSES_DIR)/.configured + +$(NCURSES_DIR)/lib/libncurses.so.5.2: $(NCURSES_DIR)/.configured + $(MAKE) BUILD_CC=$(TARGET_CC) HOSTCC=$(HOSTCC) \ + BUILD_CCFLAGS="-I$(NCURSES_DIR) -I$(NCURSES_DIR)/include" \ + BUILD_LDFLAGS="" DESTDIR=$(STAGING_DIR) -C $(NCURSES_DIR) \ + libs panel menu form headers + +$(STAGING_DIR)/lib/libncurses.a: $(NCURSES_DIR)/lib/libncurses.so.5.2 + BUILD_CC=$(TARGET_CC) HOSTCC=$(HOSTCC) CC=$(TARGET_CC) \ + $(MAKE) \ + prefix=$(STAGING_DIR) \ + exec_prefix=$(STAGING_DIR) \ + bindir=$(STAGING_DIR)/bin \ + sbindir=$(STAGING_DIR)/sbin \ + libexecdir=$(STAGING_DIR)/lib \ + datadir=$(STAGING_DIR)/usr/share \ + sysconfdir=$(STAGING_DIR)/etc \ + localstatedir=$(STAGING_DIR)/var \ + libdir=$(STAGING_DIR)/lib \ + infodir=$(STAGING_DIR)/info \ + mandir=$(STAGING_DIR)/man \ + includedir=$(STAGING_DIR)/include \ + gxx_include_dir=$(STAGING_DIR)/include/c++ \ + ticdir=$(STAGING_DIR)/usr/share/terminfo \ + -C $(NCURSES_DIR) install; + chmod a-x $(NCURSES_DIR)/lib/libncurses.so* + touch -c $(STAGING_DIR)/lib/libncurses.a + +$(TARGET_DIR)/lib/libncurses.so.5.2: $(STAGING_DIR)/lib/libncurses.a + cp -dpf $(NCURSES_DIR)/lib/libncurses.so* $(TARGET_DIR)/lib/ + -cp -dpf $(STAGING_DIR)/usr/lib/terminfo $(TARGET_DIR)/usr/lib/ + mkdir -p $(TARGET_DIR)/usr/share/terminfo + for i in x/xterm x/xterm-color x/xterm-xfree86 v/vt100 v/vt200 a/ansi l/linux; do \ + cp -dpf $(STAGING_DIR)/usr/share/terminfo/$${i} $(TARGET_DIR)/usr/share/terminfo/; \ + done + +$(TARGET_DIR)/usr/lib/libncurses.a: $(STAGING_DIR)/lib/libncurses.a + cp -dpf $(NCURSES_DIR)/include/curses.h $(TARGET_DIR)/usr/include/ncurses.h + cp -dpf $(NCURSES_DIR)/include/term.h $(TARGET_DIR)/usr/include/ + cp -dpf $(NCURSES_DIR)/include/unctrl.h $(TARGET_DIR)/usr/include/ + cp -dpf $(NCURSES_DIR)/include/termcap.h $(TARGET_DIR)/usr/include/ + cp -dpf $(NCURSES_DIR)/lib/libncurses.a $(TARGET_DIR)/usr/lib/ + rm -f $(TARGET_DIR)/usr/lib/terminfo + (cd $(TARGET_DIR)/usr/lib; ln -fs /usr/share/terminfo) + (cd $(TARGET_DIR)/usr/lib; ln -fs libncurses.a libcurses.a) + (cd $(TARGET_DIR)/usr/lib; ln -fs libncurses.a libtermcap.a) + (cd $(TARGET_DIR)/usr/include; ln -fs ncurses.h curses.h) + rm -f $(TARGET_DIR)/lib/libncurses.so + (cd $(TARGET_DIR)/usr/lib; ln -fs /lib/libncurses.so.5.2 libncurses.so) + -$(STRIP) --strip-unneeded $(TARGET_DIR)/lib/libncurses.so.5.2 + touch -c $(TARGET_DIR)/usr/lib/libncurses.a + +ncurses-headers: $(TARGET_DIR)/usr/lib/libncurses.a + +ncurses-source: $(DL_DIR)/$(NCURSES_SOURCE) + +ncurses-clean: + rm -f $(STAGING_DIR)/lib/libncurses.so* $(TARGET_DIR)/lib/libncurses.so* + rm -f $(STAGING_DIR)/usr/share/tabset $(TARGET_DIR)/usr/share/tabset + rm -rf $(STAGING_DIR)/usr/share/terminfo $(TARGET_DIR)/usr/share/terminfo + -$(MAKE) -C $(NCURSES_DIR) clean + +ncurses-dirclean: + rm -rf $(NCURSES_DIR) + +ncurses: $(TARGET_DIR)/lib/libncurses.so.5.2 + diff --git a/obsolete-buildroot/make/netfilter.mk b/obsolete-buildroot/make/netfilter.mk new file mode 100644 index 0000000000..114a31940f --- /dev/null +++ b/obsolete-buildroot/make/netfilter.mk @@ -0,0 +1,49 @@ +############################################################# +# +# netfilter +# +############################################################# + +NETFILTER_SNAPSHOT:=20040508 +NETFILTER_SOURCE:=patch-o-matic-$(NETFILTER_SNAPSHOT).tar.bz2 +NETFILTER_SITE:=ftp://ftp.netfilter.org/pub/patch-o-matic/snapshot/ +NETFILTER_DIR:=$(BUILD_DIR)/patch-o-matic-$(NETFILTER_SNAPSHOT) +NETFILTER_CAT:=bzcat + +# ipv6_mld breaks net/ipv6/mcast.c +NETFILTER_EXCLUDE:=--exclude submitted/89_ipv6_mld_netfilter.patch + +NETFILTER_PATCHES:= \ + base \ + extra/CLASSIFY.patch \ + extra/CONNMARK.patch \ + extra/IPMARK.patch \ + extra/condition.patch \ + extra/h323-conntrack-nat.patch \ + extra/mms-conntrack-nat.patch \ + extra/pptp-conntrack-nat.patch \ + extra/string.patch + +LINUX_DIR:=$(BUILD_DIR)/WRT54GS/release/src/linux/linux + +$(DL_DIR)/$(NETFILTER_SOURCE): + $(WGET) -P $(DL_DIR) $(NETFILTER_SITE)/$(NETFILTER_SOURCE) + +netfilter-source: $(DL_DIR)/$(NETFILTER_SOURCE) + +$(NETFILTER_DIR)/.unpacked: $(DL_DIR)/$(NETFILTER_SOURCE) + $(NETFILTER_CAT) $(DL_DIR)/$(NETFILTER_SOURCE) | tar -C $(BUILD_DIR) -xvf - + #ignore whitespace in patches + $(SED) "s,\-p1,\-l \-p1," $(NETFILTER_DIR)/runme + touch $(NETFILTER_DIR)/.unpacked + +$(LINUX_DIR)/.nf-patched: $(LINUX_DIR)/.patched $(NETFILTER_DIR)/.unpacked + -(cd $(NETFILTER_DIR); KERNEL_DIR=$(LINUX_DIR) ./runme --batch $(NETFILTER_EXCLUDE) $(NETFILTER_PATCHES)) + touch $(LINUX_DIR)/.nf-patched + +netfilter: $(LINUX_DIR)/.nf-patched + +netfilter-clean: + +netfilter-dirclean: + rm -rf $(NETFILTER_DIR) diff --git a/obsolete-buildroot/make/netkitbase.mk b/obsolete-buildroot/make/netkitbase.mk new file mode 100644 index 0000000000..cb2a023e00 --- /dev/null +++ b/obsolete-buildroot/make/netkitbase.mk @@ -0,0 +1,57 @@ +############################################################# +# +# netkitbase +# +############################################################# +NETKITBASE_SOURCE:=netkit-base-0.17.tar.gz +NETKITBASE_SITE:=ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/ +NETKITBASE_DIR:=$(BUILD_DIR)/netkit-base-0.17 +NETKITBASE_CAT:=zcat +NETKITBASE_BINARY:=inetd/inetd +NETKITBASE_TARGET_BINARY:=usr/sbin/inetd + +$(DL_DIR)/$(NETKITBASE_SOURCE): + $(WGET) -P $(DL_DIR) $(NETKITBASE_SITE)/$(NETKITBASE_SOURCE) + +netkitbase-source: $(DL_DIR)/$(NETKITBASE_SOURCE) + +$(NETKITBASE_DIR)/.unpacked: $(DL_DIR)/$(NETKITBASE_SOURCE) + $(NETKITBASE_CAT) $(DL_DIR)/$(NETKITBASE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # use ANSI syntax + $(SED) "s/main()/main(void)/;" $(NETKITBASE_DIR)/configure + # don't try to run cross compiled binaries while configuring things + $(SED) "s~./__conftest~#./__conftest~;" $(NETKITBASE_DIR)/configure + touch $(NETKITBASE_DIR)/.unpacked + +$(NETKITBASE_DIR)/.configured: $(NETKITBASE_DIR)/.unpacked + (cd $(NETKITBASE_DIR); PATH=$(TARGET_PATH) CC=$(TARGET_CC) \ + ./configure --installroot=$(TARGET_DIR) --with-c-compiler=$(TARGET_CC) \ + ) + touch $(NETKITBASE_DIR)/.configured + +$(NETKITBASE_DIR)/$(NETKITBASE_BINARY): $(NETKITBASE_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(NETKITBASE_DIR) + $(STRIP) $(NETKITBASE_DIR)/$(NETKITBASE_BINARY) + +$(TARGET_DIR)/$(NETKITBASE_TARGET_BINARY): $(NETKITBASE_DIR)/$(NETKITBASE_BINARY) + # Only install a few selected items... + mkdir -p $(TARGET_DIR)/usr/sbin + cp $(NETKITBASE_DIR)/$(NETKITBASE_BINARY) $(TARGET_DIR)/$(NETKITBASE_TARGET_BINARY) + mkdir -p $(TARGET_DIR)/etc + cp $(NETKITBASE_DIR)/etc.sample/inetd.conf $(TARGET_DIR)/etc/ + $(SED) "s/^\([a-z]\)/#\1/;" $(TARGET_DIR)/etc/inetd.conf + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(NETKITBASE_DIR) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +netkitbase: uclibc $(TARGET_DIR)/$(NETKITBASE_TARGET_BINARY) + +netkitbase-clean: + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(NETKITBASE_DIR) uninstall + -rm -f $(TARGET_DIR)/usr/sbin/inetd $(TARGET_DIR)/etc/inetd.conf + -rm -f $(TARGET_DIR)/etc/inetd.conf + -$(MAKE) -C $(NETKITBASE_DIR) clean + +netkitbase-dirclean: + rm -rf $(NETKITBASE_DIR) + diff --git a/obsolete-buildroot/make/netkittelnet.mk b/obsolete-buildroot/make/netkittelnet.mk new file mode 100644 index 0000000000..401b885cab --- /dev/null +++ b/obsolete-buildroot/make/netkittelnet.mk @@ -0,0 +1,59 @@ +############################################################# +# +# netkittelnet +# +############################################################# +NETKITTELNET_SOURCE:=netkit-telnet-0.17.tar.gz +NETKITTELNET_SITE:=ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/ +NETKITTELNET_DIR:=$(BUILD_DIR)/netkit-telnet-0.17 +NETKITTELNET_CAT:=zcat +NETKITTELNET_BINARY:=telnetd/telnetd +NETKITTELNET_TARGET_BINARY:=usr/sbin/telnetd +NETKITTELNET_PATCH:=$(SOURCE_DIR)/netkittelnet.patch + +$(DL_DIR)/$(NETKITTELNET_SOURCE): + $(WGET) -P $(DL_DIR) $(NETKITTELNET_SITE)/$(NETKITTELNET_SOURCE) + +netkittelnet-source: $(DL_DIR)/$(NETKITTELNET_SOURCE) + +$(NETKITTELNET_DIR)/.unpacked: $(DL_DIR)/$(NETKITTELNET_SOURCE) + $(NETKITTELNET_CAT) $(DL_DIR)/$(NETKITTELNET_SOURCE) | tar -C $(BUILD_DIR) -xvf - + # use ANSI syntax + $(SED) "s/main()/main(void)/;" $(NETKITTELNET_DIR)/configure + # Disable termcap support + $(SED) "s~\(.*termcap\.h.*\)~/* \1 */~;" $(NETKITTELNET_DIR)/telnetd/telnetd.c + # don't try to run cross compiled binaries while configuring things + cat $(NETKITTELNET_PATCH) | patch -p1 -d $(NETKITTELNET_DIR) + touch $(NETKITTELNET_DIR)/.unpacked + +$(NETKITTELNET_DIR)/.configured: $(NETKITTELNET_DIR)/.unpacked + (cd $(NETKITTELNET_DIR); PATH=$(TARGET_PATH) CC=$(TARGET_CC) \ + ./configure --installroot=$(TARGET_DIR) --with-c-compiler=$(TARGET_CC) \ + ) + touch $(NETKITTELNET_DIR)/.configured + +$(NETKITTELNET_DIR)/$(NETKITTELNET_BINARY): $(NETKITTELNET_DIR)/.configured + $(MAKE) SUB=telnetd CC=$(TARGET_CC) -C $(NETKITTELNET_DIR) + $(STRIP) $(NETKITTELNET_DIR)/$(NETKITTELNET_BINARY) + +$(TARGET_DIR)/$(NETKITTELNET_TARGET_BINARY): $(NETKITTELNET_DIR)/$(NETKITTELNET_BINARY) + # Only install a few selected items... + mkdir -p $(TARGET_DIR)/usr/sbin + rm -f $(TARGET_DIR)/$(NETKITTELNET_TARGET_BINARY) + cp $(NETKITTELNET_DIR)/$(NETKITTELNET_BINARY) $(TARGET_DIR)/$(NETKITTELNET_TARGET_BINARY) + # Enable telnet in inetd + $(SED) "s~^#telnet.*~telnet\tstream\ttcp\tnowait\troot\t/usr/sbin/telnetd\t/usr/sbin/telnetd~;" $(TARGET_DIR)/etc/inetd.conf + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(NETKITTELNET_DIR) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +netkittelnet: uclibc netkitbase $(TARGET_DIR)/$(NETKITTELNET_TARGET_BINARY) + +netkittelnet-clean: + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(NETKITTELNET_DIR) uninstall + -rm -f $(TARGET_DIR)/usr/sbin/telnetd + -$(MAKE) -C $(NETKITTELNET_DIR) clean + +netkittelnet-dirclean: + rm -rf $(NETKITTELNET_DIR) + diff --git a/obsolete-buildroot/make/netsnmp.mk b/obsolete-buildroot/make/netsnmp.mk new file mode 100644 index 0000000000..eeb2449676 --- /dev/null +++ b/obsolete-buildroot/make/netsnmp.mk @@ -0,0 +1,105 @@ +############################################################# +# +# netsnmp +# +############################################################# + +NETSNMP_URL:=http://aleron.dl.sourceforge.net/sourceforge/net-snmp/ +NETSNMP_DIR:=$(BUILD_DIR)/net-snmp-5.1 +NETSNMP_SOURCE:=net-snmp-5.1.tar.gz +NETSNMP_PATCH1:=net-snmp_5.1-5.diff.gz +NETSNMP_PATCH1_URL:=http://ftp.debian.org/debian/pool/main/n/net-snmp/ +NETSNMP_PATCH2:=$(SOURCE_DIR)/netsnmp.patch + +$(DL_DIR)/$(NETSNMP_SOURCE): + $(WGET) -P $(DL_DIR) $(NETSNMP_URL)/$(NETSNMP_SOURCE) + +$(DL_DIR)/$(NETSNMP_PATCH1): + $(WGET) -P $(DL_DIR) $(NETSNMP_PATCH1_URL)/$(NETSNMP_PATCH1) + +$(NETSNMP_DIR)/.unpacked: $(DL_DIR)/$(NETSNMP_SOURCE) $(DL_DIR)/$(NETSNMP_PATCH1) + zcat $(DL_DIR)/$(NETSNMP_SOURCE) | tar -C $(BUILD_DIR) -xvf - + zcat $(DL_DIR)/$(NETSNMP_PATCH1) | patch -p1 -d $(NETSNMP_DIR) + cat $(NETSNMP_PATCH2) | patch -p1 -d $(NETSNMP_DIR) + touch $(NETSNMP_DIR)/.unpacked + +# We set CAN_USE_SYSCTL to no and use /proc since the +# sysctl code in this thing is apparently intended for +# freebsd or some such thing... +$(NETSNMP_DIR)/.configured: $(NETSNMP_DIR)/.unpacked + (cd $(NETSNMP_DIR); autoconf; \ + ac_cv_CAN_USE_SYSCTL=no \ + PATH=$(TARGET_PATH) \ + ./configure \ + --with-cc=$(TARGET_CROSS)gcc \ + --with-ar=$(TARGET_CROSS)ar \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --with-endianness=little \ + --with-persistent-directory=/var/lib/snmp \ + --enable-ucd-snmp-compatibility \ + --enable-shared \ + --disable-static \ + --with-logfile=none \ + --without-rpm \ + --with-openssl \ + --without-dmalloc \ + --without-efence \ + --without-rsaref \ + --with-sys-contact="root" \ + --with-sys-location="Unknown" \ + --with-mib-modules="host smux ucd-snmp/dlmod" \ + --with-defaults \ + --prefix=/usr \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --infodir=/usr/info \ + ); + touch $(NETSNMP_DIR)/.configured + +$(NETSNMP_DIR)/agent/snmpd: $(NETSNMP_DIR)/.configured + $(MAKE) -C $(NETSNMP_DIR) + +$(TARGET_DIR)/usr/sbin/snmpd: $(NETSNMP_DIR)/agent/snmpd + #$(MAKE) DESTDIR=$(TARGET_DIR) -C $(NETSNMP_DIR) install + $(MAKE) PREFIX=$(TARGET_DIR)/usr \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + persistentdir=$(TARGET_DIR)/var/lib/snmp \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(STAGING_DIR)/include/net-snmp \ + ucdincludedir=$(STAGING_DIR)/include/ucd-snmp \ + -C $(NETSNMP_DIR) install; + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Copy the .conf files. + mkdir -p $(TARGET_DIR)/etc/snmp + cp $(NETSNMP_DIR)/EXAMPLE.conf $(TARGET_DIR)/etc/snmp/snmpd.conf + cp $(NETSNMP_DIR)/EXAMPLE-trap.conf $(TARGET_DIR)/etc/snmp/snmptrapd.conf + -mv $(TARGET_DIR)/usr/share/snmp/mib2c*.conf $(TARGET_DIR)/etc/snmp + mkdir -p $(TARGET_DIR)/etc/default + cp $(NETSNMP_DIR)/debian/snmpd.default $(TARGET_DIR)/etc/default/snmpd + # Remove the unsupported snmpcheck program + rm $(TARGET_DIR)/usr/bin/snmpcheck + # Install the "broken" headers + cp $(NETSNMP_DIR)/agent/mibgroup/struct.h $(STAGING_DIR)/include/net-snmp/agent + cp $(NETSNMP_DIR)/agent/mibgroup/util_funcs.h $(STAGING_DIR)/include/net-snmp + cp $(NETSNMP_DIR)/agent/mibgroup/mibincl.h $(STAGING_DIR)/include/net-snmp/library + cp $(NETSNMP_DIR)/agent/mibgroup/header_complex.h $(STAGING_DIR)/include/net-snmp/agent + +netsnmp: $(TARGET_DIR)/usr/sbin/snmpd + +netsnmp-headers: $(TARGET_DIR)/usr/include/net-snmp/net-snmp-config.h + cp -a $(STAGING_DIR)/include/net-snmp $(TARGET_DIR)/usr/include/net-snmp + cp -a $(STAGING_DIR)/include/ucd-snmp $(TARGET_DIR)/usr/include/net-snmp + +netsnmp-source: $(DL_DIR)/$(NETSNMP_SOURCE) + +netsnmp-clean: + $(MAKE) -C $(NETSNMP_DIR) clean + +netsnmp-dirclean: + rm -rf $(NETSNMP_DIR) + diff --git a/obsolete-buildroot/make/newt.mk b/obsolete-buildroot/make/newt.mk new file mode 100644 index 0000000000..cc2359e70d --- /dev/null +++ b/obsolete-buildroot/make/newt.mk @@ -0,0 +1,72 @@ +############################################################# +# +# newt +# +############################################################# +NEWT_SOURCE=newt-0.51.0.tar.bz2 +NEWT_SITE=http://www.uclibc.org/ +NEWT_DIR=$(BUILD_DIR)/newt-0.51.0 +NEWT_VERSION=0.51.0 +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +NEWT_CFLAGS=-Os -g -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 +else +NEWT_CFLAGS=-Os -g +endif +NEWT_CFLAGS+=-fPIC + +$(DL_DIR)/$(NEWT_SOURCE): + $(WGET) -P $(DL_DIR) $(NEWT_SITE)/$(NEWT_SOURCE) + +$(NEWT_DIR)/.source: $(DL_DIR)/$(NEWT_SOURCE) + bzcat $(DL_DIR)/$(NEWT_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(NEWT_DIR)/.source; + +$(NEWT_DIR)/.configured: $(NEWT_DIR)/.source + (cd $(NEWT_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(NEWT_DIR)/.configured; + +$(NEWT_DIR)/libnewt.so.$(NEWT_VERSION): $(NEWT_DIR)/.configured + $(MAKE) CFLAGS="$(NEWT_CFLAGS)" CC=$(TARGET_CC) -C $(NEWT_DIR) + touch -c $(NEWT_DIR)/libnewt.so.$(NEWT_VERSION) + +$(STAGING_DIR)/lib/libnewt.a: $(NEWT_DIR)/libnewt.so.$(NEWT_VERSION) + cp -a $(NEWT_DIR)/libnewt.a $(STAGING_DIR)/lib; + cp -a $(NEWT_DIR)/newt.h $(STAGING_DIR)/include; + cp -a $(NEWT_DIR)/libnewt.so* $(STAGING_DIR)/lib; + (cd $(STAGING_DIR)/lib; ln -fs libnewt.so.$(NEWT_VERSION) libnewt.so); + (cd $(STAGING_DIR)/lib; ln -fs libnewt.so.$(NEWT_VERSION) libnewt.so.0.51); + touch -c $(STAGING_DIR)/lib/libnewt.a + +$(TARGET_DIR)/lib/libnewt.so.$(NEWT_VERSION): $(STAGING_DIR)/lib/libnewt.a + cp -a $(STAGING_DIR)/lib/libnewt.so* $(TARGET_DIR)/lib; + -$(STRIP) --strip-unneeded $(TARGET_DIR)/lib/libnewt.so* + touch -c $(TARGET_DIR)/lib/libnewt.so.$(NEWT_VERSION) + +newt: uclibc slang $(TARGET_DIR)/lib/libnewt.so.$(NEWT_VERSION) + +newt-source: $(DL_DIR)/$(NEWT_SOURCE) + +newt-clean: + rm -f $(TARGET_DIR)/lib/libnewt.so* + -$(MAKE) -C $(NEWT_DIR) clean + +newt-dirclean: slang-dirclean + rm -rf $(NEWT_DIR) + diff --git a/obsolete-buildroot/make/ntp.mk b/obsolete-buildroot/make/ntp.mk new file mode 100644 index 0000000000..b3f840a3e1 --- /dev/null +++ b/obsolete-buildroot/make/ntp.mk @@ -0,0 +1,62 @@ +############################################################# +# +# ntp +# +############################################################# +NTP_SOURCE:=ntp-4.1.2.tar.gz +NTP_SITE:=http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4 +NTP_DIR:=$(BUILD_DIR)/ntp-4.1.2 +NTP_CAT:=zcat +NTP_BINARY:=ntpdate/ntpdate +NTP_TARGET_BINARY:=usr/bin/ntpdate + + +$(DL_DIR)/$(NTP_SOURCE): + $(WGET) -P $(DL_DIR) $(NTP_SITE)/$(NTP_SOURCE) + +ntp-source: $(DL_DIR)/$(NTP_SOURCE) + +$(NTP_DIR)/.unpacked: $(DL_DIR)/$(NTP_SOURCE) + $(NTP_CAT) $(DL_DIR)/$(NTP_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SED) "s,^#if.*__GLIBC__.*_BSD_SOURCE.*$$,#if 0," \ + $(NTP_DIR)/ntpd/refclock_pcf.c; + touch $(NTP_DIR)/.unpacked + +$(NTP_DIR)/.configured: $(NTP_DIR)/.unpacked + (cd $(NTP_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-shared \ + --program-transform-name=s,,, \ + ); + touch $(NTP_DIR)/.configured + +$(NTP_DIR)/$(NTP_BINARY): $(NTP_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(NTP_DIR) + +$(TARGET_DIR)/$(NTP_TARGET_BINARY): $(NTP_DIR)/$(NTP_BINARY) + install -m 755 $(NTP_DIR)/$(NTP_BINARY) $(TARGET_DIR)/$(NTP_TARGET_BINARY) + +ntp: uclibc $(TARGET_DIR)/$(NTP_TARGET_BINARY) + +ntp-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(NTP_DIR) uninstall + -$(MAKE) -C $(NTP_DIR) clean + +ntp-dirclean: + rm -rf $(NTP_DIR) + diff --git a/obsolete-buildroot/make/openssh.mk b/obsolete-buildroot/make/openssh.mk new file mode 100644 index 0000000000..c7feba20c6 --- /dev/null +++ b/obsolete-buildroot/make/openssh.mk @@ -0,0 +1,78 @@ +############################################################# +# +# openssh +# +############################################################# + +OPENSSH_SITE:=ftp://ftp.tux.org/bsd/openbsd/OpenSSH/portable/ +OPENSSH_DIR:=$(BUILD_DIR)/openssh-3.8p1 +OPENSSH_SOURCE:=openssh-3.8p1.tar.gz +OPENSSH_PATCH:=$(SOURCE_DIR)/openssh.patch + +$(DL_DIR)/$(OPENSSH_SOURCE): + $(WGET) -P $(DL_DIR) $(OPENSSH_SITE)/$(OPENSSH_SOURCE) + +$(OPENSSH_DIR)/.unpacked: $(DL_DIR)/$(OPENSSH_SOURCE) $(OPENSSH_PATCH) + zcat $(DL_DIR)/$(OPENSSH_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(OPENSSH_PATCH) | patch -p1 -d $(OPENSSH_DIR) + touch $(OPENSSH_DIR)/.unpacked + +$(OPENSSH_DIR)/.configured: $(OPENSSH_DIR)/.unpacked + (cd $(OPENSSH_DIR); rm -rf config.cache; autoconf; \ + $(TARGET_CONFIGURE_OPTS) \ + LD=$(TARGET_CROSS)gcc \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/sbin \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --includedir=$(STAGING_DIR)/include \ + --disable-lastlog --disable-utmp \ + --disable-utmpx --disable-wtmp --disable-wtmpx \ + --without-x \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(OPENSSH_DIR)/.configured + +$(OPENSSH_DIR)/ssh: $(OPENSSH_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(OPENSSH_DIR) + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/scp + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/sftp + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/sftp-server + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh-add + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh-agent + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh-keygen + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh-keyscan + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh-keysign + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/ssh-rand-helper + -$(STRIP) --strip-unneeded $(OPENSSH_DIR)/sshd + +$(TARGET_DIR)/usr/bin/ssh: $(OPENSSH_DIR)/ssh + $(MAKE) CC=$(TARGET_CC) DESTDIR=$(TARGET_DIR) -C $(OPENSSH_DIR) install + mkdir -p $(TARGET_DIR)/etc/init.d/ + cp $(OPENSSH_DIR)/S50sshd $(TARGET_DIR)/etc/init.d/ + chmod a+x $(TARGET_DIR)/etc/init.d/S50sshd + rm -rf $(TARGET_DIR)/usr/info $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +openssh: $(TARGET_DIR)/usr/bin/ssh + +openssh-source: $(DL_DIR)/$(OPENSSH_SOURCE) + +openssh-clean: + $(MAKE) -C $(OPENSSH_DIR) clean + +openssh-dirclean: + rm -rf $(OPENSSH_DIR) + diff --git a/obsolete-buildroot/make/openssl.mk b/obsolete-buildroot/make/openssl.mk new file mode 100644 index 0000000000..a4003553b1 --- /dev/null +++ b/obsolete-buildroot/make/openssl.mk @@ -0,0 +1,78 @@ +############################################################# +# +# openssl +# +############################################################# + +# TARGETS +OPENSSL_SITE:=http://www.openssl.org/source +OPENSSL_SOURCE:=openssl-0.9.7d.tar.gz +OPENSSL_DIR:=$(BUILD_DIR)/openssl-0.9.7d +OPENSSL_PATCH=$(SOURCE_DIR)/openssl.patch + +$(DL_DIR)/$(OPENSSL_SOURCE): + $(WGET) -P $(DL_DIR) $(OPENSSL_SITE)/$(OPENSSL_SOURCE) + +$(OPENSSL_DIR)/.unpacked: $(DL_DIR)/$(OPENSSL_SOURCE) $(OPENSSL_PATCH) + gunzip -c $(DL_DIR)/$(OPENSSL_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(OPENSSL_PATCH) | patch -p1 -d $(OPENSSL_DIR) + # sigh... we have to resort to this just to set a gcc flag. + $(SED) 's,/CFLAG=,/CFLAG= $(TARGET_SOFT_FLOAT) ,g' \ + $(OPENSSL_DIR)/Configure + touch $(OPENSSL_DIR)/.unpacked + +$(OPENSSL_DIR)/Makefile: $(OPENSSL_DIR)/.unpacked + (cd $(OPENSSL_DIR); \ + CFLAGS="-DOPENSSL_NO_KRB5 -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5" \ + PATH=$(TARGET_PATH) ./Configure linux-$(ARCH) --prefix=/ \ + --openssldir=/usr/lib/ssl -L$(STAGING_DIR)/lib -ldl \ + -I$(STAGING_DIR)/include $(OPENSSL_OPTS) no-threads \ + shared no-idea no-mdc2 no-rc5) + +$(OPENSSL_DIR)/apps/openssl: $(OPENSSL_DIR)/Makefile + $(MAKE) CC=$(TARGET_CC) -C $(OPENSSL_DIR) all build-shared + # Work around openssl build bug to link libssl.so with libcrypto.so. + -rm $(OPENSSL_DIR)/libssl.so.*.*.* + $(MAKE) CC=$(TARGET_CC) -C $(OPENSSL_DIR) do_linux-shared + +$(STAGING_DIR)/lib/libcrypto.a: $(OPENSSL_DIR)/apps/openssl + $(MAKE) CC=$(TARGET_CC) INSTALL_PREFIX=$(STAGING_DIR) -C $(OPENSSL_DIR) install + cp -fa $(OPENSSL_DIR)/libcrypto.so* $(STAGING_DIR)/lib/ + chmod a-x $(STAGING_DIR)/lib/libcrypto.so.0.9.7 + (cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so) + (cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so.0) + cp -fa $(OPENSSL_DIR)/libssl.so* $(STAGING_DIR)/lib/ + chmod a-x $(STAGING_DIR)/lib/libssl.so.0.9.7 + (cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so) + (cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so.0) + +$(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7: $(STAGING_DIR)/lib/libcrypto.a + mkdir -p $(TARGET_DIR)/usr/lib + cp -fa $(STAGING_DIR)/lib/libcrypto.so* $(TARGET_DIR)/usr/lib/ + cp -fa $(STAGING_DIR)/lib/libssl.so* $(TARGET_DIR)/usr/lib/ + #cp -fa $(STAGING_DIR)/bin/openssl $(TARGET_DIR)/bin/ + -$(STRIP) --strip-unneeded $(TARGET_DIR)/usr/lib/libssl.so.0.9.7 + -$(STRIP) --strip-unneeded $(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7 + +$(TARGET_DIR)/usr/lib/libssl.a: $(STAGING_DIR)/lib/libcrypto.a + mkdir -p $(TARGET_DIR)/usr/include + cp -a $(STAGING_DIR)/include/openssl $(TARGET_DIR)/usr/include/ + cp -dpf $(STAGING_DIR)/lib/libssl.a $(TARGET_DIR)/usr/lib/ + cp -dpf $(STAGING_DIR)/lib/libcrypto.a $(TARGET_DIR)/usr/lib/ + touch -c $(TARGET_DIR)/usr/lib/libssl.a + +openssl-headers: $(TARGET_DIR)/usr/lib/libssl.a + +openssl: uclibc $(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7 + +openssl-source: $(DL_DIR)/$(OPENSSL_SOURCE) + +openssl-clean: + rm -f $(STAGING_DIR)/bin/openssl $(TARGET_DIR)/bin/openssl + rm -f $(STAGING_DIR)/lib/libcrypto.so* $(TARGET_DIR)/lib/libcrypto.so* + rm -f $(STAGING_DIR)/lib/libssl.so* $(TARGET_DIR)/lib/libssl.so* + $(MAKE) -C $(OPENSSL_DIR) clean + +openssl-dirclean: + rm -rf $(OPENSSL_DIR) + diff --git a/obsolete-buildroot/make/openvpn.mk b/obsolete-buildroot/make/openvpn.mk new file mode 100644 index 0000000000..0ac6279328 --- /dev/null +++ b/obsolete-buildroot/make/openvpn.mk @@ -0,0 +1,68 @@ +############################################################# +# +# openvpn +# +# NOTE: Uses start-stop-daemon in init script, so be sure +# to enable that within busybox +# +############################################################# +OPENVPN_SOURCE:=openvpn-1.5.0.tar.gz +OPENVPN_SITE:=http://aleron.dl.sourceforge.net/sourceforge/openvpn/ +OPENVPN_DIR:=$(BUILD_DIR)/openvpn-1.5.0 +OPENVPN_CAT:=zcat +OPENVPN_BINARY:=openvpn +OPENVPN_TARGET_BINARY:=usr/sbin/openvpn +#OPENVPN_PATCH:=$(SOURCE_DIR)/openvpn.patch + +$(DL_DIR)/$(OPENVPN_SOURCE): + $(WGET) -P $(DL_DIR) $(OPENVPN_SITE)/$(OPENVPN_SOURCE) + +openvpn-source: $(DL_DIR)/$(OPENVPN_SOURCE) + +$(OPENVPN_DIR)/.unpacked: $(DL_DIR)/$(OPENVPN_SOURCE) + $(OPENVPN_CAT) $(DL_DIR)/$(OPENVPN_SOURCE) | tar -C $(BUILD_DIR) -xvf - + #cat $(OPENVPN_PATCH) | patch -p1 -d $(OPENVPN_DIR) + touch $(OPENVPN_DIR)/.unpacked + +$(OPENVPN_DIR)/.configured: $(OPENVPN_DIR)/.unpacked + (cd $(OPENVPN_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --program-prefix="" \ + --enable-pthread \ + ); + touch $(OPENVPN_DIR)/.configured + +$(OPENVPN_DIR)/$(OPENVPN_BINARY): $(OPENVPN_DIR)/.configured + $(MAKE) -C $(OPENVPN_DIR) + +$(TARGET_DIR)/$(OPENVPN_TARGET_BINARY): $(OPENVPN_DIR)/$(OPENVPN_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(OPENVPN_DIR) install + mkdir -p $(TARGET_DIR)/etc/openvpn + cp $(SOURCE_DIR)/openvpn $(TARGET_DIR)/etc/init.d/openvpn + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +openvpn: uclibc lzo openssl $(TARGET_DIR)/$(OPENVPN_TARGET_BINARY) + +openvpn-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(OPENVPN_DIR) uninstall + -$(MAKE) -C $(OPENVPN_DIR) clean + +openvpn-dirclean: + rm -rf $(OPENVPN_DIR) + diff --git a/obsolete-buildroot/make/openwrt.mk b/obsolete-buildroot/make/openwrt.mk new file mode 100644 index 0000000000..f3b479b901 --- /dev/null +++ b/obsolete-buildroot/make/openwrt.mk @@ -0,0 +1,270 @@ +# Makefile for to build the base openwrt +# +# Copyright (C) 2004 Manuel Novoa III +# +# 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 +# +###################################################################### +# +# WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! +# +# Currently the dependencies are not all handled. But that's true of +# our buildroot in general, since it wasn't really set up for end users. + +OPENWRT_TARGETS:= openwrt-linux openwrt-kmodules.tar.bz2 \ + openwrt-shared openwrt-mtd openwrt-nvram openwrt-wlconf \ + bridge dnsmasq1 iptables wtools busybox \ + openwrt-rootprep + +.PHONY: $(OPENWRT_TARGETS) openwrt-code.bin + +openwrt-base: $(OPENWRT_TARGETS) + +###################################################################### + +ifneq ($(filter $(TARGETS),openwrt-base),) + +# WRT54G_SOURCE=wrt54gv2.2.02.2.tgz +# WRT54G_SITE=http://www.linksys.com/support/opensourcecode/wrt54gv2/2.02.2 + +# WRT54G_SOURCE=wrt54g.2.02.7.tgz +# WRT54G_SITE=http://www.linksys.com/support/opensourcecode/wrt54gv2/2.02.7 +# WRT54G_DIR=$(BUILD_DIR)/WRT54G + +WRT54G_SOURCE=wrt54gs.2.07.1.tgz +WRT54G_SITE=http://www.linksys.com/support/opensourcecode/wrt54gs/2.07.1 + +WRT54G_DIR=$(BUILD_DIR)/WRT54GS + +# OPENWRT_ROOT=openwrt-root.tar.bz2 +# OPENWRT_SITE=http://127.0.0.1 +# OPENWRT_DIR=$(BUILD_DIR)/openwrt + +LINUX_DIR=$(WRT54G_DIR)/release/src/linux/linux +LINUX_FORMAT=zImage +LINUX_BINLOC=arch/mips/brcm-boards/bcm947xx/compressed/vmlinuz + +TARGET_MODULES_DIR:=$(TARGET_DIR)/lib/modules/2.4.20 + +$(LINUX_DIR)/.unpacked: $(WRT54G_DIR)/.prepared + -(cd $(BUILD_DIR); ln -sf $(LINUX_DIR) linux) + # preserve the binary-only driver + #mv $(LINUX_DIR)/drivers/net/mac/mac.o \ + # $(LINUX_DIR)/drivers/net/mac/mac.o-saved + touch $(LINUX_DIR)/.unpacked + +$(LINUX_DIR)/.patched: $(WRT54G_DIR)/.prepared + $(SOURCE_DIR)/patch-kernel.sh $(LINUX_DIR)/../.. $(SOURCE_DIR) openwrt-linux-netfilter.patch + $(SOURCE_DIR)/patch-kernel.sh $(LINUX_DIR)/../.. $(SOURCE_DIR) openwrt-wrt54g-linux.patch + # use replacement diag module code + cp -f $(SOURCE_DIR)/openwrt-diag.c $(LINUX_DIR)/drivers/net/diag/diag_led.c + cp -f $(SOURCE_DIR)/openwrt-wrt54g-linux.config $(LINUX_DIR)/.config + -(cd $(BUILD_DIR); ln -sf $(LINUX_DIR) linux) + touch $(LINUX_DIR)/.patched + +$(LINUX_DIR)/.configured: $(LINUX_DIR)/.patched netfilter + $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/Makefile + $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/arch/mips/Makefile + $(SED) "s,\-mcpu=,\-mtune=,g;" $(LINUX_DIR)/arch/mips/Makefile + make -C $(LINUX_DIR) oldconfig include/linux/version.h + touch $(LINUX_DIR)/.configured + +$(LINUX_DIR)/.depend_done: $(LINUX_DIR)/.configured $(GCC_BUILD_DIR2)/.installed + $(MAKE) -C $(LINUX_DIR) dep + touch $(LINUX_DIR)/.depend_done + +$(LINUX_DIR)/$(LINUX_BINLOC): $(LINUX_DIR)/.depend_done + $(MAKE) -C $(LINUX_DIR) $(LINUX_FORMAT) + +openwrt-kmodules.tar.bz2: $(LINUX_DIR)/$(LINUX_BINLOC) + $(MAKE) -C $(LINUX_DIR) modules + $(MAKE) -C $(LINUX_DIR) DEPMOD=/bin/true \ + INSTALL_MOD_PATH=$(LINUX_DIR)/modules modules_install + tar -C $(LINUX_DIR)/modules/lib -cjf openwrt-kmodules.tar.bz2 modules + +openwrt-linux: $(LINUX_DIR)/$(LINUX_BINLOC) + +$(DL_DIR)/$(WRT54G_SOURCE): + $(WGET) -P $(DL_DIR) $(WRT54G_SITE)/$(WRT54G_SOURCE) + +$(WRT54G_DIR)/.source: $(DL_DIR)/$(WRT54G_SOURCE) + #zcat $(DL_DIR)/$(WRT54G_SOURCE) | tar -C $(BUILD_DIR) -xvf - WRT54G/README.TXT WRT54G/release + zcat $(DL_DIR)/$(WRT54G_SOURCE) | tar -C $(BUILD_DIR) -xvf - WRT54GS/README.TXT WRT54GS/release + touch $(WRT54G_DIR)/.source + +$(WRT54G_DIR)/.prepared: $(WRT54G_DIR)/.source + $(SOURCE_DIR)/patch-kernel.sh $(WRT54G_DIR) $(SOURCE_DIR) openwrt-wrt54g-router.patch + $(SOURCE_DIR)/patch-kernel.sh $(WRT54G_DIR) $(SOURCE_DIR) openwrt-wrt54g-shared.patch + touch $(WRT54G_DIR)/.prepared + +###################################################################### + +OPENWRT_ROOT_SKEL:=root.tar.gz +OPENWRT_SITE=http://openwrt.ksilebo.net/cgi-bin/viewcvs.cgi/root + +$(DL_DIR)/$(OPENWRT_ROOT_SKEL): + $(WGET) -P $(DL_DIR) $(OPENWRT_SITE)/$(OPENWRT_ROOT_SKEL) + +###################################################################### + +OPENWRT_SRCBASE:=$(WRT54G_DIR)/release/src +OPENWRT_SHARED_BUILD_DIR:=$(OPENWRT_SRCBASE)/router/shared +OPENWRT_SHARED_TARGET_BINARY:=usr/lib/libshared.so + +$(TARGET_DIR)/$(OPENWRT_SHARED_TARGET_BINARY): $(WRT54G_DIR)/.source + $(MAKE) -C $(OPENWRT_SHARED_BUILD_DIR) -f Makefile-openwrt \ + SRCBASE=$(OPENWRT_SRCBASE) INSTALLDIR=$(TARGET_DIR) \ + CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld STRIP="$(STRIP)" \ + CFLAGS="$(TARGET_CFLAGS) -I. -I$(OPENWRT_SRCBASE)/include -Wall -I$(OPENWRT_SRCBASE)/" \ + install + +openwrt-shared: $(TARGET_DIR)/$(OPENWRT_SHARED_TARGET_BINARY) + +openwrt-shared-clean: + -$(MAKE) -C $(OPENWRT_SHARED_BUILD_DIR) clean + +###################################################################### + +OPENWRT_NVRAM_BUILD_DIR:=$(OPENWRT_SRCBASE)/router/nvram +OPENWRT_NVRAM_TARGET_BINARY:=usr/sbin/nvram + +$(TARGET_DIR)/$(OPENWRT_NVRAM_TARGET_BINARY): $(WRT54G_DIR)/.source + $(MAKE) -C $(OPENWRT_NVRAM_BUILD_DIR) \ + SRCBASE=$(OPENWRT_SRCBASE) INSTALLDIR=$(TARGET_DIR) \ + CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld STRIP="$(STRIP)" \ + CFLAGS="$(TARGET_CFLAGS) -I. -I$(OPENWRT_SRCBASE)/include -Wall -DOPENWRT_NVRAM" \ + install + + +openwrt-nvram: $(TARGET_DIR)/$(OPENWRT_NVRAM_TARGET_BINARY) + +openwrt-nvram-clean: + -$(MAKE) -C $(OPENWRT_NVRAM_BUILD_DIR) clean + +###################################################################### + +OPENWRT_MTD_BUILD_DIR:=$(OPENWRT_SRCBASE)/router/rc +OPENWRT_MTD_TARGET_BINARY:=sbin/mtd + +$(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY): $(WRT54G_DIR)/.source $(TARGET_DIR)/$(OPENWRT_NVRAM_TARGET_BINARY) # need libnvram + $(MAKE) -C $(OPENWRT_MTD_BUILD_DIR) -f Makefile-openwrt \ + TOP=$(OPENWRT_SRCBASE)/router \ + SRCBASE=$(OPENWRT_SRCBASE) INSTALLDIR=$(TARGET_DIR) \ + CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld STRIP="$(STRIP)" \ + CFLAGS="$(TARGET_CFLAGS) -I. -I$(OPENWRT_SRCBASE)/router/shared -I$(OPENWRT_SRCBASE)/include -Wall -I$(OPENWRT_SRCBASE)/" \ + install + +openwrt-mtd: $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY) + +openwrt-mtd-clean: + -$(MAKE) -C $(OPENWRT_MTD_BUILD_DIR) clean + +###################################################################### + +OPENWRT_WLCONF_BUILD_DIR:=$(OPENWRT_SRCBASE)/router/wlconf +OPENWRT_WLCONF_TARGET_BINARY:=usr/sbin/wlconf + +$(TARGET_DIR)/$(OPENWRT_WLCONF_TARGET_BINARY): $(WRT54G_DIR)/.source + $(MAKE) -C $(OPENWRT_WLCONF_BUILD_DIR) \ + TOP=$(OPENWRT_SRCBASE)/router \ + SRCBASE=$(OPENWRT_SRCBASE) INSTALLDIR=$(TARGET_DIR) \ + CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld STRIP="$(STRIP)" \ + CFLAGS="$(TARGET_CFLAGS) -I. -I$(OPENWRT_SRCBASE)/router/shared -I$(OPENWRT_SRCBASE)/include -Wall" \ + install + + +openwrt-wlconf: $(TARGET_DIR)/$(OPENWRT_WLCONF_TARGET_BINARY) + +openwrt-wlconf-clean: + -$(MAKE) -C $(OPENWRT_WLCONF_BUILD_DIR) clean + +###################################################################### + +openwrt-rootprep: + # tmp + mkdir -p $(TARGET_DIR)/tmp + chmod a+rwxt $(TARGET_DIR)/tmp + ln -sf /tmp $(TARGET_DIR)/var + rm -f $(TARGET_DIR)/usr/tmp + ln -sf ../tmp $(TARGET_DIR)/usr/tmp + # dev + mkdir -p $(TARGET_DIR)/dev + # etc + mkdir -p $(TARGET_DIR)/etc + ln -sf /tmp/resolv.conf $(TARGET_DIR)/etc/resolv.conf + # miscellaneous + mkdir -p $(TARGET_DIR)/mnt + mkdir -p $(TARGET_DIR)/proc + mkdir -p $(TARGET_DIR)/jffs + mkdir -p $(TARGET_DIR)/rom + # modules + mkdir -p $(TARGET_MODULES_DIR) + cp $(LINUX_DIR)/drivers/net/wl/wl.o $(TARGET_MODULES_DIR) + #cp $(LINUX_DIR)/drivers/net/et.4702/et.4702.o $(TARGET_MODULES_DIR) + cp $(LINUX_DIR)/drivers/net/et/et.o $(TARGET_MODULES_DIR) + cp $(LINUX_DIR)/drivers/net/diag/diag.o $(TARGET_MODULES_DIR) + +###################################################################### + +openwrt-prune: + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + # remove unneeded uClibc libs + rm -rf $(TARGET_DIR)/lib/libthread_db* + rm -rf $(TARGET_DIR)/lib/libpthread* + # remove unneeded uClibc utils + rm -f $(TARGET_DIR)/sbin/ldconfig + rm -f $(TARGET_DIR)/usr/bin/ldd + # remove other unneeded files + rm -f $(TARGET_DIR)/usr/sbin/iptables-save + rm -f $(TARGET_DIR)/usr/sbin/iptables-restore + rm -f $(TARGET_DIR)/usr/sbin/ip6tables + +###################################################################### + +openwrt-linux.trx: openwrt-prune squashfsroot + $(WRT54G_DIR)/release/tools/trx -o openwrt-linux.trx \ + $(LINUX_DIR)/$(LINUX_BINLOC) $(IMAGE) + +openwrt-gs-code.bin: openwrt-linux.trx + $(WRT54G_DIR)/release/tools/addpattern -i openwrt-linux.trx \ + -o openwrt-gs-code.bin -g + +openwrt-g-code.bin: openwrt-gs-code.bin + sed -e "1s,^W54S,W54G," < openwrt-gs-code.bin > openwrt-g-code.bin + +openwrt-code.bin: openwrt-gs-code.bin openwrt-g-code.bin + +###################################################################### + +openwrt-sourceball: + tar cjf buildroot-openwrt.tar.bz2 \ + README.openwrt \ + Makefile \ + Makefile-openwrt \ + make/openwrt.mk \ + make/uclibc.mk \ + make/busybox.mk \ + sources/uClibc.config \ + sources/uClibc.config-openwrt \ + sources/busybox-openwrt-*.patch \ + sources/busybox.config \ + sources/busybox.config-openwrt \ + sources/dnsmasq1-openwrt.patch \ + sources/iptables-openwrt-extensions.patch \ + sources/openwrt-wrt54g-linux.config \ + sources/openwrt-wrt54g-*.patch \ + sources/openwrt-diag.c + +endif diff --git a/obsolete-buildroot/make/patch.mk b/obsolete-buildroot/make/patch.mk new file mode 100644 index 0000000000..d49102c855 --- /dev/null +++ b/obsolete-buildroot/make/patch.mk @@ -0,0 +1,60 @@ +############################################################# +# +# patch +# +############################################################# +GNUPATCH_SOURCE:=patch_2.5.9.orig.tar.gz +GNUPATCH_SITE:=http://ftp.debian.org/debian/pool/main/p/patch +GNUPATCH_CAT:=zcat +GNUPATCH_DIR:=$(BUILD_DIR)/patch-2.5.9 +GNUPATCH_BINARY:=patch +GNUPATCH_TARGET_BINARY:=usr/bin/patch + +$(DL_DIR)/$(GNUPATCH_SOURCE): + $(WGET) -P $(DL_DIR) $(GNUPATCH_SITE)/$(GNUPATCH_SOURCE) + +patch-source: $(DL_DIR)/$(GNUPATCH_SOURCE) + +$(GNUPATCH_DIR)/.unpacked: $(DL_DIR)/$(GNUPATCH_SOURCE) + $(GNUPATCH_CAT) $(DL_DIR)/$(GNUPATCH_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(GNUPATCH_DIR)/.unpacked + +$(GNUPATCH_DIR)/.configured: $(GNUPATCH_DIR)/.unpacked + (cd $(GNUPATCH_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(GNUPATCH_DIR)/.configured + +$(GNUPATCH_DIR)/$(GNUPATCH_BINARY): $(GNUPATCH_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(GNUPATCH_DIR) + +$(TARGET_DIR)/$(GNUPATCH_TARGET_BINARY): $(GNUPATCH_DIR)/$(GNUPATCH_BINARY) + rm -f $(TARGET_DIR)/$(GNUPATCH_TARGET_BINARY) + cp -a $(GNUPATCH_DIR)/$(GNUPATCH_BINARY) $(TARGET_DIR)/$(GNUPATCH_TARGET_BINARY) + +patch: uclibc $(TARGET_DIR)/$(GNUPATCH_TARGET_BINARY) + +patch-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(GNUPATCH_DIR) uninstall + -$(MAKE) -C $(GNUPATCH_DIR) clean + +patch-dirclean: + rm -rf $(GNUPATCH_DIR) + diff --git a/obsolete-buildroot/make/pciutils.mk b/obsolete-buildroot/make/pciutils.mk new file mode 100644 index 0000000000..f8608d8fce --- /dev/null +++ b/obsolete-buildroot/make/pciutils.mk @@ -0,0 +1,71 @@ +############################################################# +# +# pciutils +# +############################################################# +PCIUTILS_SOURCE:=pciutils-2.1.10.tar.gz +PCIUTILS_SITE:=ftp://atrey.karlin.mff.cuni.cz/pub/linux/pci +PCIUTILS_DIR:=$(BUILD_DIR)/pciutils-2.1.10 +PCIUTILS_CAT:=zcat + +# Yet more targets... +PCIIDS_SITE:=http://pciids.sourceforge.net/ +PCIIDS_SOURCE:=pci.ids.bz2 +PCIIDS_CAT:=bzcat + +$(DL_DIR)/$(PCIUTILS_SOURCE): + $(WGET) -P $(DL_DIR) $(PCIUTILS_SITE)/$(PCIUTILS_SOURCE) + +$(DL_DIR)/$(PCIIDS_SOURCE): + $(WGET) -P $(DL_DIR) $(PCIIDS_SITE)/$(PCIIDS_SOURCE) + +pciutils-source: $(DL_DIR)/$(PCIUTILS_SOURCE) $(DL_DIR)/$(PCIIDS_SOURCE) + +$(PCIUTILS_DIR)/.unpacked: $(DL_DIR)/$(PCIUTILS_SOURCE) $(DL_DIR)/$(PCIIDS_SOURCE) + $(PCIUTILS_CAT) $(DL_DIR)/$(PCIUTILS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(PCIIDS_CAT) $(DL_DIR)/$(PCIIDS_SOURCE) > $(PCIUTILS_DIR)/pci.id + touch $(PCIUTILS_DIR)/.unpacked + +$(PCIUTILS_DIR)/.configured: $(PCIUTILS_DIR)/.unpacked + (cd $(PCIUTILS_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(PCIUTILS_DIR)/.configured + +$(PCIUTILS_DIR)/lspci: $(PCIUTILS_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(PCIUTILS_DIR) + +$(TARGET_DIR)/sbin/lspci: $(PCIUTILS_DIR)/lspci + install -c $(PCIUTILS_DIR)/lspci $(TARGET_DIR)/sbin/lspci + +$(TARGET_DIR)/sbin/setpci: $(PCIUTILS_DIR)/setpci + install -c $(PCIUTILS_DIR)/setpci $(TARGET_DIR)/sbin/setpci + +$(TARGET_DIR)/usr/share/misc/pci.ids: $(PCIUTILS_DIR)/.dist + install -Dc $(PCIUTILS_DIR)/pci.ids $(TARGET_DIR)/usr/share/misc/pci.ids + + +pciutils: uclibc $(TARGET_DIR)/sbin/setpci $(TARGET_DIR)/sbin/lspci $(TARGET_DIR)/usr/share/misc/pci.ids + +pciutils-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(PCIUTILS_DIR) uninstall + -$(MAKE) -C $(PCIUTILS_DIR) clean + +pciutils-dirclean: + rm -rf $(PCIUTILS_DIR) + diff --git a/obsolete-buildroot/make/pcmcia.mk b/obsolete-buildroot/make/pcmcia.mk new file mode 100644 index 0000000000..8ae82633c9 --- /dev/null +++ b/obsolete-buildroot/make/pcmcia.mk @@ -0,0 +1,108 @@ +############################################################# +# +# pcmcia card services +# +############################################################# +# Copyright (C) 2001-2003 by Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + +PCMCIA_SOURCE:=pcmcia-cs-3.2.7.tar.gz +PCMCIA_SITE:=http://aleron.dl.sourceforge.net/sourceforge/pcmcia-cs +PCMCIA_DIR:=$(BUILD_DIR)/pcmcia-cs-3.2.7 +PCMCIA_PATCH:=$(SOURCE_DIR)/pcmcia.patch +PCMCIA_CAT:=zcat + +$(DL_DIR)/$(PCMCIA_SOURCE): + $(WGET) -P $(DL_DIR) $(PCMCIA_SITE)/$(PCMCIA_SOURCE) + +pcmcia-source: $(DL_DIR)/$(PCMCIA_SOURCE) + +$(PCMCIA_DIR)/.unpacked: $(DL_DIR)/$(PCMCIA_SOURCE) + $(PCMCIA_CAT) $(DL_DIR)/$(PCMCIA_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(PCMCIA_DIR)/.unpacked + +$(PCMCIA_DIR)/.patched: $(PCMCIA_DIR)/.unpacked + cat $(PCMCIA_PATCH) | patch -d $(PCMCIA_DIR) -p1 + touch $(PCMCIA_DIR)/.patched + +$(PCMCIA_DIR)/.configured: $(PCMCIA_DIR)/.patched + ( cd $(PCMCIA_DIR) ; ./Configure --kernel=$(LINUX_SOURCE_DIR) --noprompt \ + --rcdir=/etc --arch=$(ARCH) --trust --srctree --nocardbus \ + --sysv --kcc=$(KERNEL_CROSS)gcc --ucc=$(TARGET_CC) --ld=$(TARGET_CROSS)ld \ + --target=$(TARGET_DIR)) + $(SED) "s/pump/udhcpc/" $(PCMCIA_DIR)/etc/network + $(SED) "s/ide_cs/ide-cs/" $(PCMCIA_DIR)/etc/config + $(SED) "s/bind \"wvlan_cs\"/bind \"orinoco_cs\"/g" $(PCMCIA_DIR)/etc/config + touch $(PCMCIA_DIR)/.configured + +$(PCMCIA_DIR)/cardmgr/cardmgr: $(PCMCIA_DIR)/.configured + $(MAKE) -C $(PCMCIA_DIR) -i all + -A=`find $(PCMCIA_DIR) -type f -perm +111` ; \ + for fo in $$A; do \ + file $$fo | grep "ELF" | grep "executable" > /dev/null 2>&1; \ + if [ $$? = 0 ] ; then \ + $(STRIP) $$fo; \ + fi; \ + done + touch -c $(PCMCIA_DIR)/cardmgr/cardmgr + +$(TARGET_DIR)/sbin/cardmgr: $(PCMCIA_DIR)/cardmgr/cardmgr + rm -rf $(TARGET_DIR)/etc/pcmcia; + $(MAKE) -i -C $(PCMCIA_DIR) install + rm -rf $(TARGET_DIR)/usr/man; + rm -rf $(TARGET_DIR)/usr/share/man; + rm -rf $(TARGET_DIR)/usr/X11R6/man; + rm -rf $(TARGET_DIR)/etc/rc.d; + rm -rf $(TARGET_DIR)/etc/rc?.d; + rm -f $(TARGET_DIR)/etc/init.d/pcmcia*; + rm -f $(TARGET_DIR)/sbin/dump_cis $(TARGET_DIR)/sbin/pack_cis + rm -f $(TARGET_DIR)/usr/share/pnp.ids $(TARGET_DIR)/sbin/lspnp $(TARGET_DIR)/sbin/setpnp; + rm -f $(TARGET_DIR)/sbin/pcinitrd + rm -f $(TARGET_DIR)/sbin/probe + rm -f $(TARGET_DIR)/sbin/ide_info + rm -f $(TARGET_DIR)/sbin/scsi_info + rm -f $(TARGET_DIR)/sbin/ftl_check + rm -f $(TARGET_DIR)/sbin/ftl_format + rm -f $(TARGET_DIR)/usr/X11R6/bin/xcardinfo + rm -rf $(TARGET_DIR)/etc/sysconfig + mkdir -p $(TARGET_DIR)/etc/default + cp -f $(PCMCIA_DIR)/etc/pcmcia $(TARGET_DIR)/etc/default/ + cp -f $(PCMCIA_DIR)/etc/rc.pcmcia $(TARGET_DIR)/etc/init.d/S30pcmcia + rm -rf $(TARGET_DIR)/etc/pcmcia/cis + chmod a+x $(TARGET_DIR)/etc/init.d/S30pcmcia + chmod -R u+w $(TARGET_DIR)/etc/pcmcia/* + +# use busybox depmod.pl so we need the sources unpacked +$(PCMCIA_DIR)/.modules.dep: $(BUSYBOX_DIR)/.configured $(TARGET_DIR)/lib/modules + [ -d $(TARGET_DIR)/lib/modules/$(LINUX_VERSION) ] && \ + $(BUSYBOX_DIR)/examples/depmod.pl \ + -b $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/ \ + -k $(LINUX_DIR)/vmlinux \ + -F $(LINUX_DIR)/System.map \ + > $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep + touch $(PCMCIA_DIR)/.modules.dep + +pcmcia: uclibc $(TARGET_DIR)/sbin/cardmgr $(PCMCIA_DIR)/.modules.dep + +pcmcia-clean: + rm -f $(TARGET_DIR)/sbin/cardmgr + -$(MAKE) -C $(PCMCIA_DIR) clean + rm -f $(PCMCIA_DIR)/.configured $(PCMCIA_DIR)/config.out + +pcmcia-dirclean: + rm -rf $(PCMCIA_DIR) diff --git a/obsolete-buildroot/make/pppd.mk b/obsolete-buildroot/make/pppd.mk new file mode 100644 index 0000000000..a76149b9aa --- /dev/null +++ b/obsolete-buildroot/make/pppd.mk @@ -0,0 +1,68 @@ +############################################################# +# +# pppd +# +############################################################# +PPPD_SOURCE:=ppp-2.4.1.tar.gz +PPPD_SITE:=ftp://ftp.samba.org/pub/ppp +PPPD_DIR:=$(BUILD_DIR)/ppp-2.4.1 +PPPD_CAT:=zcat +PPPD_BINARY:=pppd/pppd +PPPD_TARGET_BINARY:=usr/sbin/pppd + + +$(DL_DIR)/$(PPPD_SOURCE): + $(WGET) -P $(DL_DIR) $(PPPD_SITE)/$(PPPD_SOURCE) + +pppd-source: $(DL_DIR)/$(PPPD_SOURCE) + +$(PPPD_DIR)/.unpacked: $(DL_DIR)/$(PPPD_SOURCE) + $(PPPD_CAT) $(DL_DIR)/$(PPPD_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SED) 's/ -DIPX_CHANGE -DHAVE_MULTILINK -DHAVE_MMAP//' $(PPPD_DIR)/pppd/Makefile.linux + $(SED) 's/$(INSTALL) -s/$(INSTALL)/' $(PPPD_DIR)/*/Makefile.linux + $(SED) 's/ -o root//' $(PPPD_DIR)/*/Makefile.linux + $(SED) 's/ -g daemon//' $(PPPD_DIR)/*/Makefile.linux + touch $(PPPD_DIR)/.unpacked + +$(PPPD_DIR)/.configured: $(PPPD_DIR)/.unpacked + (cd $(PPPD_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(PPPD_DIR)/.configured + +$(PPPD_DIR)/$(PPPD_BINARY): $(PPPD_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(PPPD_DIR) + +$(TARGET_DIR)/$(PPPD_TARGET_BINARY): $(PPPD_DIR)/$(PPPD_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(PPPD_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +pppd: uclibc $(TARGET_DIR)/$(PPPD_TARGET_BINARY) + +pppd-clean: + rm -f $(TARGET_DIR)/usr/sbin/pppd + rm -f $(TARGET_DIR)/usr/sbin/chat + rm -rf $(TARGET_DIR)/etc/ppp + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(PPPD_DIR) uninstall + -$(MAKE) -C $(PPPD_DIR) clean + +pppd-dirclean: + rm -rf $(PPPD_DIR) + + diff --git a/obsolete-buildroot/make/python.mk b/obsolete-buildroot/make/python.mk new file mode 100644 index 0000000000..0be3a74a91 --- /dev/null +++ b/obsolete-buildroot/make/python.mk @@ -0,0 +1,57 @@ +############################################################# +# +# python +# +############################################################# +PYTHON_VERSION=2.3.2 +PYTHON_SOURCE:=Python-$(PYTHON_VERSION).tgz +PYTHON_SITE:=http://python.org/ftp/python/$(PYTHON_VERSION) +PYTHON_DIR:=$(BUILD_DIR)/Python-$(PYTHON_VERSION) +PYTHON_CAT:=zcat +PYTHON_BINARY:=python +PYTHON_INSTALL_DIR:=$(BUILD_DIR)/python_install +PYTHON_TARGET_BINARY:=$(PYTHON_INSTALL_DIR)/bin/python + + +$(DL_DIR)/$(PYTHON_SOURCE): + $(WGET) -P $(DL_DIR) $(PYTHON_SITE)/$(PYTHON_SOURCE) + +python-source: $(DL_DIR)/$(PYTHON_SOURCE) + +$(PYTHON_DIR)/.unpacked: $(DL_DIR)/$(PYTHON_SOURCE) + $(PYTHON_CAT) $(DL_DIR)/$(PYTHON_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(PYTHON_DIR)/.unpacked + +$(PYTHON_DIR)/.configured: $(PYTHON_DIR)/.unpacked + (cd $(PYTHON_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --sysconfdir=/etc \ + $(DISABLE_NLS) \ + ); + touch $(PYTHON_DIR)/.configured + +$(PYTHON_DIR)/$(PYTHON_BINARY): $(PYTHON_DIR)/.configured + LD_LIBRARY_PATH=$(STAGING_DIR)/lib + $(MAKE) CC=$(TARGET_CC) -C $(PYTHON_DIR) + +$(TARGET_DIR)/$(PYTHON_TARGET_BINARY): $(PYTHON_DIR)/$(PYTHON_BINARY) + +python: uclibc $(TARGET_DIR)/$(PYTHON_TARGET_BINARY) + $(MAKE) CC=$(TARGET_CC) -C $(PYTHON_DIR) install + rm $(PYTHON_INSTALL_DIR)/bin/idle + rm $(PYTHON_INSTALL_DIR)/bin/pydoc + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +python-clean: + -$(MAKE) -C $(PYTHON_DIR) distclean + rm $(PYTHON_DIR)/.configured + +python-dirclean: + rm -rf $(PYTHON_DIR) + diff --git a/obsolete-buildroot/make/raidtools.mk b/obsolete-buildroot/make/raidtools.mk new file mode 100644 index 0000000000..657f245f31 --- /dev/null +++ b/obsolete-buildroot/make/raidtools.mk @@ -0,0 +1,59 @@ +############################################################# +# +# raidtools2 +# +############################################################# +RAIDTOOLS2_SOURCE:=raidtools2-1.00.3.tar.gz +RAIDTOOLS2_SITE:= +RAIDTOOLS2_DIR:=$(BUILD_DIR)/raidtools2-1.00.3 +RAIDTOOLS2_CAT:=zcat +RAIDTOOLS2_BINARY:=mkraid +RAIDTOOLS2_TARGET_BINARY:=sbin/mkraid + +$(DL_DIR)/$(RAIDTOOLS2_SOURCE): + $(WGET) -P $(DL_DIR) $(RAIDTOOLS2_SITE)/$(RAIDTOOLS2_SOURCE) + +raidtools2-source: $(DL_DIR)/$(RAIDTOOLS2_SOURCE) + +$(RAIDTOOLS2_DIR)/.unpacked: $(DL_DIR)/$(RAIDTOOLS2_SOURCE) + $(RAIDTOOLS2_CAT) $(DL_DIR)/$(RAIDTOOLS2_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(RAIDTOOLS2_DIR)/.unpacked + +$(RAIDTOOLS2_DIR)/.configured: $(RAIDTOOLS2_DIR)/.unpacked + (cd $(RAIDTOOLS2_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share/misc \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --enable-fsect-man5 \ + ); + touch $(RAIDTOOLS2_DIR)/.configured + +$(RAIDTOOLS2_DIR)/$(RAIDTOOLS2_BINARY): $(RAIDTOOLS2_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(RAIDTOOLS2_DIR) + +$(TARGET_DIR)/$(RAIDTOOLS2_TARGET_BINARY): $(RAIDTOOLS2_DIR)/$(RAIDTOOLS2_BINARY) + $(MAKE) ROOTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(RAIDTOOLS2_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +raidtools2: zlib uclibc $(TARGET_DIR)/$(RAIDTOOLS2_TARGET_BINARY) + +raidtools2-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(RAIDTOOLS2_DIR) uninstall + -$(MAKE) -C $(RAIDTOOLS2_DIR) clean + +raidtools2-dirclean: + rm -rf $(RAIDTOOLS2_DIR) diff --git a/obsolete-buildroot/make/rxvt.mk b/obsolete-buildroot/make/rxvt.mk new file mode 100644 index 0000000000..a633547038 --- /dev/null +++ b/obsolete-buildroot/make/rxvt.mk @@ -0,0 +1,70 @@ +############################################################# +# +# rxvt +# +############################################################# +# Copyright (C) 2002 by Tom Walsh +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + +RXVT_SOURCE:=rxvt-2.6.4.tar.bz2 +RXVT_PATCH:=$(SOURCE_DIR)/rxvt-2.6.4.patch +RXVT_SITE:=ftp://ftp.rxvt.org/pub/rxvt/ +RXVT_CAT:=bzcat +RXVT_DIR:=$(BUILD_DIR)/rxvt-2.6.4 +RXVT_BINARY:=$(RXVT_DIR)/src/rxvt + +$(DL_DIR)/$(RXVT_SOURCE): + $(WGET) -P $(DL_DIR) $(RXVT_SITE)/$(RXVT_SOURCE) + +rxvt-source: $(DL_DIR)/$(RXVT_SOURCE) + +$(RXVT_DIR)/.unpacked: $(DL_DIR)/$(RXVT_SOURCE) + $(RXVT_CAT) $(DL_DIR)/$(RXVT_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(RXVT_DIR)/.unpacked + +$(RXVT_DIR)/.configured: $(RXVT_DIR)/.unpacked + (cd $(RXVT_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr/X11R6 \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --x-includes=$(TINYX_DIR)/exports/include \ + --x-libraries=$(TINYX_DIR)/exports/lib \ + ); + cat $(RXVT_PATCH) | patch -d $(RXVT_DIR) -p1 + touch $(RXVT_DIR)/.configured + +$(RXVT_BINARY): $(RXVT_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(RXVT_DIR) + $(STRIP) -x $(RXVT_BINARY) + +$(TARGET_DIR)/usr/X11R6/bin/rxvt: $(RXVT_BINARY) + cp -f $(RXVT_BINARY) $(TARGET_DIR)/usr/X11R6/bin + +rxvt: tinyx $(TARGET_DIR)/usr/X11R6/bin/rxvt + +rxvt-clean: + rm -f $(TARGET_DIR)/usr/X11R6/bin/rxvt + -$(MAKE) -C $(RXVT_DIR) clean + +rxvt-dirclean: + rm -rf $(RXVT_DIR) + diff --git a/obsolete-buildroot/make/sed.mk b/obsolete-buildroot/make/sed.mk new file mode 100644 index 0000000000..2476c59aad --- /dev/null +++ b/obsolete-buildroot/make/sed.mk @@ -0,0 +1,136 @@ +############################################################# +# +# sed +# +############################################################# +SED_SOURCE:=sed-4.0.8.tar.gz +SED_SITE:=ftp://ftp.gnu.org/gnu/sed +SED_CAT:=zcat +SED_DIR1:=$(TOOL_BUILD_DIR)/sed-4.0.8 +SED_DIR2:=$(BUILD_DIR)/sed-4.0.8 +SED_BINARY:=sed/sed +SED_TARGET_BINARY:=bin/sed +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +SED_CPPFLAGS=-D_FILE_OFFSET_BITS=64 +endif +SED:=$(STAGING_DIR)/bin/sed -i -e + +HOST_SED_TARGET=$(shell ./sources/sedcheck.sh) + +$(DL_DIR)/$(SED_SOURCE): + $(WGET) -P $(DL_DIR) $(SED_SITE)/$(SED_SOURCE) + +sed-source: $(DL_DIR)/$(SED_SOURCE) + + +############################################################# +# +# build sed for use on the host system +# +############################################################# +$(SED_DIR1)/.unpacked: $(DL_DIR)/$(SED_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + mkdir -p $(DL_DIR) + mkdir -p $(STAGING_DIR)/bin; + $(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - + touch $(SED_DIR1)/.unpacked + +$(SED_DIR1)/.configured: $(SED_DIR1)/.unpacked + (cd $(SED_DIR1); rm -rf config.cache; \ + ./configure \ + --prefix=$(STAGING_DIR) \ + --prefix=/usr \ + ); + touch $(SED_DIR1)/.configured + +$(SED_DIR1)/$(SED_BINARY): $(SED_DIR1)/.configured + $(MAKE) -C $(SED_DIR1) + +# This stuff is needed to work around GNU make deficiencies +build-sed-host-binary: $(SED_DIR1)/$(SED_BINARY) + @if [ -L $(STAGING_DIR)/$(SED_TARGET_BINARY) ] ; then \ + rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); fi; + @if [ ! -f $(STAGING_DIR)/$(SED_TARGET_BINARY) -o $(STAGING_DIR)/$(SED_TARGET_BINARY) \ + -ot $(SED_DIR1)/$(SED_BINARY) ] ; then \ + set -x; \ + mkdir -p $(STAGING_DIR)/bin; \ + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) install; \ + mv $(STAGING_DIR)/usr/bin/sed $(STAGING_DIR)/bin/; \ + rm -rf $(STAGING_DIR)/share/locale $(STAGING_DIR)/usr/info \ + $(STAGING_DIR)/usr/man $(STAGING_DIR)/usr/share/doc; fi + +use-sed-host-binary: + @if [ -x /usr/bin/sed ]; then SED="/usr/bin/sed"; else \ + if [ -x /bin/sed ]; then SED="/bin/sed"; fi; fi; \ + mkdir -p $(STAGING_DIR)/bin; \ + rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); \ + ln -s $$SED $(STAGING_DIR)/$(SED_TARGET_BINARY) + +host-sed: $(HOST_SED_TARGET) + +host-sed-clean: + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) uninstall + -$(MAKE) -C $(SED_DIR1) clean + +host-sed-dirclean: + rm -rf $(SED_DIR1) + + +############################################################# +# +# build sed for use on the target system +# +############################################################# +$(SED_DIR2)/.unpacked: $(DL_DIR)/$(SED_SOURCE) + $(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(SED_DIR2)/.unpacked + +$(SED_DIR2)/.configured: $(SED_DIR2)/.unpacked + (cd $(SED_DIR2); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CPPFLAGS="$(SED_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(SED_DIR2)/.configured + +$(SED_DIR2)/$(SED_BINARY): $(SED_DIR2)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(SED_DIR2) + +# This stuff is needed to work around GNU make deficiencies +sed-target_binary: $(SED_DIR2)/$(SED_BINARY) + @if [ -L $(TARGET_DIR)/$(SED_TARGET_BINARY) ] ; then \ + rm -f $(TARGET_DIR)/$(SED_TARGET_BINARY); fi; + + @if [ ! -f $(SED_DIR2)/$(SED_BINARY) -o $(TARGET_DIR)/$(SED_TARGET_BINARY) \ + -ot $(SED_DIR2)/$(SED_BINARY) ] ; then \ + set -x; \ + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) install; \ + mv $(TARGET_DIR)/usr/bin/sed $(TARGET_DIR)/bin/; \ + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc; fi + +sed: uclibc sed-target_binary + +sed-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) uninstall + -$(MAKE) -C $(SED_DIR2) clean + +sed-dirclean: + rm -rf $(SED_DIR2) + + diff --git a/obsolete-buildroot/make/sfdisk.mk b/obsolete-buildroot/make/sfdisk.mk new file mode 100644 index 0000000000..c6b5e632b0 --- /dev/null +++ b/obsolete-buildroot/make/sfdisk.mk @@ -0,0 +1,36 @@ +############################################################# +# +# sfdisk support +# +############################################################# +SFDISK_SOURCE=sfdisk.tar.bz2 +SFDISK_SITE:=http://www.uclibc.org/ +SFDISK_DIR=$(BUILD_DIR)/sfdisk + + +$(DL_DIR)/$(SFDISK_SOURCE): + $(WGET) -P $(DL_DIR) $(SFDISK_SITE)/$(SFDISK_SOURCE) + +$(SFDISK_DIR): $(DL_DIR)/$(SFDISK_SOURCE) + bzcat $(DL_DIR)/$(SFDISK_SOURCE) | tar -C $(BUILD_DIR) -xvf - + +$(SFDISK_DIR)/sfdisk: $(SFDISK_DIR) + $(MAKE) CROSS=$(TARGET_CROSS) DEBUG=false -C $(SFDISK_DIR); + -$(STRIP) $(SFDISK_DIR)/sfdisk; + touch -c $(SFDISK_DIR)/sfdisk + +$(TARGET_DIR)/sbin/sfdisk: $(SFDISK_DIR)/sfdisk + cp $(SFDISK_DIR)/sfdisk $(TARGET_DIR)/sbin/sfdisk; + touch -c $(TARGET_DIR)/sbin/sfdisk + +sfdisk: uclibc $(TARGET_DIR)/sbin/sfdisk + +sfdisk-source: $(DL_DIR)/$(SFDISK_SOURCE) + +sfdisk-clean: + rm -f $(TARGET_DIR)/sbin/sfdisk + -$(MAKE) -C $(SFDISK_DIR) clean + +sfdisk-dirclean: + rm -rf $(SFDISK_DIR) + diff --git a/obsolete-buildroot/make/slang.mk b/obsolete-buildroot/make/slang.mk new file mode 100644 index 0000000000..17dcaddd59 --- /dev/null +++ b/obsolete-buildroot/make/slang.mk @@ -0,0 +1,48 @@ +############################################################# +# +# slang +# +############################################################# +SLANG_SOURCE=slang-1.4.5-mini.tar.bz2 +SLANG_SITE:=http://www.uclibc.org/ +SLANG_DIR=$(BUILD_DIR)/slang-1.4.5-mini +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +SLANG_CFLAGS=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 +endif +SLANG_CFLAGS+=-fPIC + +$(DL_DIR)/$(SLANG_SOURCE): + $(WGET) -P $(DL_DIR) $(SLANG_SITE)/$(SLANG_SOURCE) + +$(SLANG_DIR): $(DL_DIR)/$(SLANG_SOURCE) + bzcat $(DL_DIR)/$(SLANG_SOURCE) | tar -C $(BUILD_DIR) -xvf - + +$(SLANG_DIR)/libslang.so: $(SLANG_DIR) + $(MAKE) CFLAGS="-Os -g $(SLANG_CFLAGS)" CC=$(TARGET_CC) -C $(SLANG_DIR) + touch -c $(SLANG_DIR)/libslang.so; + +$(STAGING_DIR)/lib/libslang.so.1: $(SLANG_DIR)/libslang.so + cp -a $(SLANG_DIR)/libslang.a $(STAGING_DIR)/lib; + cp -a $(SLANG_DIR)/libslang.so $(STAGING_DIR)/lib; + cp -a $(SLANG_DIR)/slang.h $(STAGING_DIR)/include; + cp -a $(SLANG_DIR)/slcurses.h $(STAGING_DIR)/include; + (cd $(STAGING_DIR)/lib; ln -fs libslang.so libslang.so.1); + touch -c $(STAGING_DIR)/lib/libslang.so.1 + +$(TARGET_DIR)/lib/libslang.so.1: $(STAGING_DIR)/lib/libslang.so.1 + cp -a $(STAGING_DIR)/lib/libslang.so* $(TARGET_DIR)/lib; + -$(STRIP) --strip-unneeded $(TARGET_DIR)/lib/libslang.so* + touch -c $(TARGET_DIR)/lib/libslang.so.1 + +slang: uclibc $(STAGING_DIR)/lib/libslang.so.1 $(TARGET_DIR)/lib/libslang.so.1 + +slang-source: $(DL_DIR)/$(SLANG_SOURCE) + +slang-clean: + rm -f $(TARGET_DIR)/lib/libslang.so* + -$(MAKE) -C $(SLANG_DIR) clean + +slang-dirclean: + rm -rf $(SLANG_DIR) + + diff --git a/obsolete-buildroot/make/socat.mk b/obsolete-buildroot/make/socat.mk new file mode 100644 index 0000000000..010326d640 --- /dev/null +++ b/obsolete-buildroot/make/socat.mk @@ -0,0 +1,67 @@ +############################################################# +# +# socat +# +############################################################# + +SOCAT_VERSION=1.3.0.1 + +# Don't alter below this line unless you (think) you know +# what you are doing! Danger, Danger! + +SOCAT_SOURCE=socat-$(SOCAT_VERSION).tar.bz2 +SOCAT_SITE=http://www.dest-unreach.org/socat/download/ +#SOCAT_DIR=$(BUILD_DIR)/${shell basename $(SOCAT_SOURCE) .tar.bz2} +SOCAT_DIR=$(BUILD_DIR)/socat-1.3 +#SOCAT_WORKDIR=$(BUILD_DIR)/socat_workdir +SOCAT_WORKDIR=$(SOCAT_DIR) + +$(DL_DIR)/$(SOCAT_SOURCE): + $(WGET) -P $(DL_DIR) $(SOCAT_SITE)/$(SOCAT_SOURCE) + +$(SOCAT_DIR)/.unpacked: $(DL_DIR)/$(SOCAT_SOURCE) + bzip2 -d -c $(DL_DIR)/$(SOCAT_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(SOCAT_DIR)/.unpacked + +$(SOCAT_WORKDIR)/Makefile: $(SOCAT_DIR)/.unpacked + rm -f $(SOCAT_WORKDIR)/Makefile + mkdir -p $(SOCAT_WORKDIR) + (cd $(SOCAT_WORKDIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + $(SOCAT_DIR)/configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + +$(SOCAT_WORKDIR)/socat: $(SOCAT_WORKDIR)/Makefile + rm -f $@ + $(MAKE) -C $(SOCAT_WORKDIR) + +$(SOCAT_WORKDIR)/.installed: $(SOCAT_WORKDIR)/socat + mkdir -p $(TARGET_DIR)/usr/man/man1 + $(MAKE) -C $(SOCAT_WORKDIR) install prefix=$(TARGET_DIR)/usr + +socat: uclibc $(SOCAT_WORKDIR)/.installed + +socat-source: $(DL_DIR)/$(SOCAT_SOURCE) + +socat-clean: + @if [ -d $(SOCAT_WORKDIR)/Makefile ] ; then \ + $(MAKE) -C $(SOCAT_WORKDIR) clean ; \ + fi; + +socat-dirclean: + rm -rf $(SOCAT_DIR) $(SOCAT_WORKDIR) + diff --git a/obsolete-buildroot/make/squashfsroot.mk b/obsolete-buildroot/make/squashfsroot.mk new file mode 100644 index 0000000000..523d5e2a9d --- /dev/null +++ b/obsolete-buildroot/make/squashfsroot.mk @@ -0,0 +1,51 @@ +############################################################# +# +# mksquashfs to build to target squashfs filesystems +# +############################################################# +SQUASHFS_DIR=$(BUILD_DIR)/squashfs1.3r3 +SQUASHFS_SOURCE=squashfs1.3r3.tar.gz +SQUASHFS_SITE=http://aleron.dl.sourceforge.net/sourceforge/squashfs + +$(DL_DIR)/$(SQUASHFS_SOURCE): + $(WGET) -P $(DL_DIR) $(SQUASHFS_SITE)/$(SQUASHFS_SOURCE) + +$(SQUASHFS_DIR): $(DL_DIR)/$(SQUASHFS_SOURCE) #$(SQUASHFS_PATCH) + zcat $(DL_DIR)/$(SQUASHFS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SOURCE_DIR)/patch-kernel.sh $(SQUASHFS_DIR) $(SOURCE_DIR) squashfs.patch + +$(SQUASHFS_DIR)/squashfs-tools/mksquashfs: $(SQUASHFS_DIR) + $(MAKE) -C $(SQUASHFS_DIR)/squashfs-tools; + +squashfs: $(SQUASHFS_DIR)/squashfs-tools/mksquashfs + +squashfs-source: $(DL_DIR)/$(SQUASHFS_SOURCE) + +squashfs-clean: + -$(MAKE) -C $(SQUASHFS_DIR)/squashfs-tools clean + +squashfs-dirclean: + rm -rf $(SQUASHFS_DIR) + +############################################################# +# +# Build the squashfs root filesystem image +# +############################################################# + +squashfsroot: squashfs + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + @rm -rf $(TARGET_DIR)/usr/man + @rm -rf $(TARGET_DIR)/usr/info + #$(SQUASHFS_DIR)/squashfs-tools/mksquashfs -q -D $(SOURCE_DIR)/device_table.txt $(TARGET_DIR) $(IMAGE) + $(SQUASHFS_DIR)/squashfs-tools/mksquashfs $(TARGET_DIR) $(IMAGE) -noappend -root-owned + +squashfsroot-source: squashfs-source + +squashfsroot-clean: + -$(MAKE) -C $(SQUASHFS_DIR) clean + +squashfsroot-dirclean: + rm -rf $(SQUASHFS_DIR) + diff --git a/obsolete-buildroot/make/strace.mk b/obsolete-buildroot/make/strace.mk new file mode 100644 index 0000000000..546584d80e --- /dev/null +++ b/obsolete-buildroot/make/strace.mk @@ -0,0 +1,59 @@ +############################################################# +# +# strace +# +############################################################# +STRACE_SOURCE:=strace-4.5.3.tar.bz2 +STRACE_SITE:=http://aleron.dl.sourceforge.net/sourceforge/strace +STRACE_CAT:=bzcat +STRACE_DIR:=$(BUILD_DIR)/strace-4.5.3 + + +$(DL_DIR)/$(STRACE_SOURCE): + $(WGET) -P $(DL_DIR) $(STRACE_SITE)/$(STRACE_SOURCE) + +strace-source: $(DL_DIR)/$(STRACE_SOURCE) + +$(STRACE_DIR)/.unpacked: $(DL_DIR)/$(STRACE_SOURCE) + $(STRACE_CAT) $(DL_DIR)/$(STRACE_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(STRACE_DIR)/.unpacked + +$(STRACE_DIR)/.configured: $(STRACE_DIR)/.unpacked + (cd $(STRACE_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(STRACE_DIR)/.configured + +$(STRACE_DIR)/strace: $(STRACE_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(STRACE_DIR) + +$(TARGET_DIR)/usr/bin/strace: $(STRACE_DIR)/strace + install -c $(STRACE_DIR)/strace $(TARGET_DIR)/usr/bin/strace + $(STRIP) $(TARGET_DIR)/usr/bin/strace > /dev/null 2>&1 + +strace: uclibc $(TARGET_DIR)/usr/bin/strace + +strace-clean: + $(MAKE) -C $(STRACE_DIR) clean + +strace-dirclean: + rm -rf $(STRACE_DIR) + + diff --git a/obsolete-buildroot/make/system-linux.mk b/obsolete-buildroot/make/system-linux.mk new file mode 100644 index 0000000000..2f55dd5979 --- /dev/null +++ b/obsolete-buildroot/make/system-linux.mk @@ -0,0 +1,59 @@ +############################################################# +# +# System Linux kernel target +# +# This uses an existing linux kernel source tree on +# your build system, and makes no effort at compiling +# anything.... +# +# You will probably want to change LINUX_SOURCE to +# point to wherever you installed you kernel. +# +# -Erik +# +############################################################# +ifneq ($(filter $(TARGETS),system-linux),) + +LINUX_SOURCE=/usr/src/linux +LINUX_DIR=$(BUILD_DIR)/linux +LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel +# Used by pcmcia-cs and others +LINUX_SOURCE_DIR=$(LINUX_SOURCE) + +$(LINUX_DIR)/.configured: + mkdir -p $(LINUX_DIR)/include + (cd $(LINUX_DIR)/include; \ + for i in $(LINUX_SOURCE)/include/*; do ln -sf $$i ; done; \ + rm -f asm; \ + if [ "$(ARCH)" = "powerpc" ];then \ + ln -fs asm-ppc asm; \ + elif [ "$(ARCH)" = "mips" ];then \ + ln -fs asm-mips asm; \ + elif [ "$(ARCH)" = "mipsel" ];then \ + ln -fs asm-mips asm; \ + elif [ "$(ARCH)" = "arm" ];then \ + ln -fs asm-arm asm; \ + (cd asm-arm; \ + if [ ! -L proc ] ; then \ + ln -fs proc-armv proc; \ + ln -fs arch-ebsa285 arch; fi); \ + elif [ "$(ARCH)" = "cris" ];then \ + ln -fs asm-cris asm; \ + else ln -fs asm-$(ARCH) asm; \ + fi) + cp $(LINUX_SOURCE)/Makefile $(LINUX_DIR)/ + cp $(LINUX_SOURCE)/Rules.make $(LINUX_DIR)/ + touch $(LINUX_DIR)/.configured + +$(LINUX_KERNEL): $(LINUX_DIR)/.configured + +system-linux: $(LINUX_DIR)/.configured + +system-linux-clean: clean + rm -f $(LINUX_KERNEL) + rm -rf $(LINUX_DIR) + +system-linux-dirclean: + rm -rf $(LINUX_DIR) + +endif diff --git a/obsolete-buildroot/make/tar.mk b/obsolete-buildroot/make/tar.mk new file mode 100644 index 0000000000..01e9187413 --- /dev/null +++ b/obsolete-buildroot/make/tar.mk @@ -0,0 +1,66 @@ +############################################################# +# +# tar +# +############################################################# +GNUTAR_SOURCE:=tar-1.13.25.tar.gz +GNUTAR_SITE:=ftp://alpha.gnu.org/gnu/tar +GNUTAR_DIR:=$(BUILD_DIR)/tar-1.13.25 +GNUTAR_CAT:=zcat +GNUTAR_BINARY:=src/tar +GNUTAR_TARGET_BINARY:=bin/tar + +$(DL_DIR)/$(GNUTAR_SOURCE): + $(WGET) -P $(DL_DIR) $(GNUTAR_SITE)/$(GNUTAR_SOURCE) + +tar-source: $(DL_DIR)/$(GNUTAR_SOURCE) + +$(GNUTAR_DIR)/.unpacked: $(DL_DIR)/$(GNUTAR_SOURCE) + $(GNUTAR_CAT) $(DL_DIR)/$(GNUTAR_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(GNUTAR_DIR)/.unpacked + +$(GNUTAR_DIR)/.configured: $(GNUTAR_DIR)/.unpacked + (cd $(GNUTAR_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + $(DISABLE_LARGEFILE) \ + ); + touch $(GNUTAR_DIR)/.configured + +$(GNUTAR_DIR)/$(GNUTAR_BINARY): $(GNUTAR_DIR)/.configured + $(MAKE) -C $(GNUTAR_DIR) + +# This stuff is needed to work around GNU make deficiencies +tar-target_binary: $(GNUTAR_DIR)/$(GNUTAR_BINARY) + @if [ -L $(TARGET_DIR)/$(GNUTAR_TARGET_BINARY) ] ; then \ + rm -f $(TARGET_DIR)/$(GNUTAR_TARGET_BINARY); fi; + @if [ ! -f $(GNUTAR_DIR)/$(GNUTAR_BINARY) -o $(TARGET_DIR)/$(GNUTAR_TARGET_BINARY) \ + -ot $(GNUTAR_DIR)/$(GNUTAR_BINARY) ] ; then \ + set -x; \ + rm -f $(TARGET_DIR)/$(GNUTAR_TARGET_BINARY); \ + cp -a $(GNUTAR_DIR)/$(GNUTAR_BINARY) $(TARGET_DIR)/$(GNUTAR_TARGET_BINARY); fi ; + +tar: uclibc tar-target_binary + +tar-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GNUTAR_DIR) uninstall + -$(MAKE) -C $(GNUTAR_DIR) clean + +tar-dirclean: + rm -rf $(GNUTAR_DIR) + diff --git a/obsolete-buildroot/make/tinylogin.mk b/obsolete-buildroot/make/tinylogin.mk new file mode 100644 index 0000000000..549de76b64 --- /dev/null +++ b/obsolete-buildroot/make/tinylogin.mk @@ -0,0 +1,52 @@ +############################################################# +# +# tinylogin +# +############################################################# +# Enable this to use the tinylogin daily snapshot +USE_TINYLOGIN_SNAPSHOT=true + +ifeq ($(USE_TINYLOGIN_SNAPSHOT),true) +# Be aware that this changes daily.... +TINYLOGIN_DIR:=$(BUILD_DIR)/tinylogin +TINYLOGIN_SOURCE:=tinylogin-snapshot.tar.bz2 +TINYLOGIN_SITE:=http://tinylogin.busybox.net/downloads/snapshots +else +TINYLOGIN_DIR:=$(BUILD_DIR)/tinylogin-1.4 +TINYLOGIN_SOURCE:=tinylogin-1.4.tar.bz2 +TINYLOGIN_SITE:=http://tinylogin.busybox.net/downloads +endif + +$(DL_DIR)/$(TINYLOGIN_SOURCE): + $(WGET) -P $(DL_DIR) $(TINYLOGIN_SITE)/$(TINYLOGIN_SOURCE) + +tinylogin-source: $(DL_DIR)/$(TINYLOGIN_SOURCE) + +$(TINYLOGIN_DIR)/Config.h: $(DL_DIR)/$(TINYLOGIN_SOURCE) + bzcat $(DL_DIR)/$(TINYLOGIN_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(SED) "s/\`id -u\` -ne 0/0 == 1/" \ + $(TINYLOGIN_DIR)/install.sh + $(SED) "s/4755 --owner=root --group=root/755/" \ + $(TINYLOGIN_DIR)/install.sh + $(SED) "s/^DOSTATIC.*/DOSTATIC=false/g;" $(TINYLOGIN_DIR)/Makefile + $(SED) "s/^DODEBUG.*/DODEBUG=false/g;" $(TINYLOGIN_DIR)/Makefile + # date test this one + touch $(TINYLOGIN_DIR)/Config.h + +$(TINYLOGIN_DIR)/tinylogin: $(TINYLOGIN_DIR)/Config.h + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" \ + CFLAGS_EXTRA="$(TARGET_CFLAGS)" -C $(TINYLOGIN_DIR) + +$(TARGET_DIR)/bin/tinylogin: $(TINYLOGIN_DIR)/tinylogin + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" \ + PREFIX="$(TARGET_DIR)" -C $(TINYLOGIN_DIR) \ + CFLAGS_EXTRA="$(TARGET_CFLAGS)" install + +tinylogin: uclibc $(TARGET_DIR)/bin/tinylogin + +tinylogin-clean: + rm -f $(TARGET_DIR)/bin/tinylogin + -$(MAKE) -C $(TINYLOGIN_DIR) clean + +tinylogin-dirclean: + rm -rf $(TINYLOGIN_DIR) diff --git a/obsolete-buildroot/make/tinyx.mk b/obsolete-buildroot/make/tinyx.mk new file mode 100644 index 0000000000..6c57e881fb --- /dev/null +++ b/obsolete-buildroot/make/tinyx.mk @@ -0,0 +1,127 @@ +############################################################# +# +# tinyx - a small footprint X-server for the TuxScreen +# +############################################################# +# Copyright (C) 2002 by Tom Walsh +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 +# +############################################################# +# You may want to change these. +############################################################# + +TINYX_APPS:=xlsfonts/xlsfonts xmodmap/xmodmap +#xset/xset xdpyinfo/xdpyinfo xsetroot/xsetroot \ +# xrdb/xrdb xrandr/xrandr \ +# xhost/xhost xauth/xauth oclock/oclock xeyes/xeyes +# + +TINYX_LIBS:=ICE X11 Xext Xpm +# Xaw SM Xt Xmu + +############################################################# +# Stuff below this line shouldn't need changes. +# if you do change, look in rxvt & matchbox for the impact! +############################################################# +# +# Where resources are found. +# +TINYX_DIR:=$(BUILD_DIR)/xc-011010 +TINYX_LDIR:=$(TINYX_DIR)/lib +TINYX_PROGS:=$(TINYX_DIR)/programs +TINYX_PATCH:=$(SOURCE_DIR)/tinyx-011010.patch +TINYX_SOURCE:=xc-011010.tar.bz2 +TINYX_SITE:= http://intimate.handhelds.org/jacques/ +TINYX_CF:=$(TINYX_DIR)/config/cf +# +# Some things that you may want to change. +# +TINYX_XFBDEV:=$(TINYX_DIR)/programs/Xserver/Xfbdev +TINYX_CAT:=bzcat +TINYX_BINX:=$(TARGET_DIR)/usr/X11R6/bin/ +TINYX_LIBX:=$(TARGET_DIR)/usr/lib/ + +# +# These rules fetch various tinyx source files. +# +$(DL_DIR)/$(TINYX_SOURCE): + $(WGET) -P $(DL_DIR) $(TINYX_SITE)/$(TINYX_SOURCE) + +$(DL_DIR)/cross.def: + $(WGET) -P $(DL_DIR) $(TINYX_SITE)/xcompile/tuxscreen/cross.def + +$(DL_DIR)/host.def: + $(WGET) -P $(DL_DIR) $(TINYX_SITE)/xcompile/tuxscreen/host.def + +# +# rule to make sure that we have the source, and it is configured. +# +$(TINYX_DIR)/.configure: $(DL_DIR)/$(TINYX_SOURCE) $(DL_DIR)/cross.def $(DL_DIR)/host.def + $(TINYX_CAT) $(DL_DIR)/$(TINYX_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(TINYX_PATCH) | patch -d $(TINYX_DIR) -p1 + cp $(DL_DIR)/host.def $(TINYX_CF)/host.def + cp $(DL_DIR)/cross.def $(TINYX_CF)/cross.def + $(SED) 's:REPLACE_STAGING_DIR:$(STAGING_DIR):g' \ + $(TINYX_CF)/cross.def \ + $(TINYX_LDIR)/X11/Xlib.h + touch $(TINYX_DIR)/.configure + +# +# Now that we have the source, build it... +# +$(TINYX_XFBDEV): $(TINYX_DIR)/.configure + rm -f $(TINYX_BINX)/Xfbdev + ( cd $(TINYX_DIR) ; $(MAKE) World ; cd $(BUILDROOT) ) + +# +# Once Frame Buffer is built, we install executables. +# +$(TINYX_BINX)/Xfbdev: $(TINYX_XFBDEV) + -mkdir $(TARGET_DIR)/usr/X11R6 + -mkdir $(TINYX_BINX) + for file in $(TINYX_APPS) ; do \ + cp -f $(TINYX_DIR)/programs/$$file $(TINYX_BINX) ; \ + $(STRIP) $(TINYX_PROGS)/$$file ; \ + done + cp $(TINYX_DIR)/programs/Xserver/Xfbdev $(TINYX_BINX) + $(STRIP) $(TINYX_BINX)/Xfbdev + cp -f $(TINYX_DIR)/startx $(TARGET_DIR)/bin + chmod a+x $(TARGET_DIR)/bin/startx + +# +# After we have executables installed, install the libraries. +# +$(TINYX_LIBX)/libX11.so.6.2: $(TINYX_XFBDEV) + for dirs in $(TINYX_LIBS) ; do \ + file=`find $(TINYX_LDIR)/$$dirs -type f -iname "lib$$dirs.so*"` ; \ + $(STRIP) --strip-unneeded $$file ; \ + cp -f $$file $(TINYX_LIBX) ; \ + file=`find $(TINYX_LDIR)/$$dirs -type l -iname "lib$$dirs.so*"` ; \ + cp -pRf $$file $(TINYX_LIBX) ; \ + done + +tinyx: zlib $(TINYX_LIBX)/libX11.so.6.2 $(TINYX_BINX)/Xfbdev + +tinyx-source: $(DL_DIR)/$(TINYX_SOURCE) + +tinyx-clean: + -rm -rf $(TARGET_DIR)/usr/X11R6 + -$(MAKE) -C $(TINYX_DIR) clean + +tinyx-dirclean: + -rm -rf $(TINYX_DIR) + -rm -rf $(TARGET_DIR)/usr/X11R6 diff --git a/obsolete-buildroot/make/tn5250.mk b/obsolete-buildroot/make/tn5250.mk new file mode 100644 index 0000000000..6fcc160d6c --- /dev/null +++ b/obsolete-buildroot/make/tn5250.mk @@ -0,0 +1,51 @@ +TN5250_SITE:=http://aleron.dl.sourceforge.net/sourceforge/tn5250 +TN5250_DIR:=$(BUILD_DIR)/tn5250-0.16.4 +TN5250_SOURCE:=tn5250-0.16.4.tar.gz + +$(DL_DIR)/$(TN5250_SOURCE): + $(WGET) -P $(DL_DIR) $(TN5250_SITE)/$(TN5250_SOURCE) + +$(TN5250_DIR)/.dist: $(DL_DIR)/$(TN5250_SOURCE) + gunzip -c $(DL_DIR)/$(TN5250_SOURCE) | tar -C $(BUILD_DIR) -xvf - + -touch $(TN5250_DIR)/.dist + +$(TN5250_DIR)/.configured: $(TN5250_DIR)/.dist + (cd $(TN5250_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-slang --without-x --without-ssl \ + ); + touch $(TN5250_DIR)/.configured + +$(TN5250_DIR)/tn5250: $(TN5250_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(TN5250_DIR) + +$(TARGET_DIR)/usr/bin/tn5250: $(TN5250_DIR)/tn5250 + install -c $(TN5250_DIR)/tn5250 $(TARGET_DIR)/usr/bin/tn5250 + +tn5250: uclibc slang $(TARGET_DIR)/usr/bin/tn5250 + +tn5250-source: $(DL_DIR)/$(TN5250_SOURCE) + +tn5250-clean: + $(MAKE) -C $(TN5250_DIR) clean + +tn5250-dirclean: + rm -rf $(TN5250_DIR) + + + diff --git a/obsolete-buildroot/make/ttcp.mk b/obsolete-buildroot/make/ttcp.mk new file mode 100644 index 0000000000..7ff5f63158 --- /dev/null +++ b/obsolete-buildroot/make/ttcp.mk @@ -0,0 +1,37 @@ +############################################################# +# +# ttcp +# +############################################################# +# +TTCP_SOURCE_URL=http://ftp.sunet.se/ftp/pub/network/monitoring/ttcp +TTCP_SOURCE=ttcp.c +TTCP_BUILD_DIR=$(BUILD_DIR)/ttcp + +$(DL_DIR)/$(TTCP_SOURCE): + $(WGET) -P $(DL_DIR) $(TTCP_SOURCE_URL)/$(TTCP_SOURCE) + +$(TTCP_BUILD_DIR)/.unpacked: $(DL_DIR)/$(TTCP_SOURCE) + -mkdir $(TTCP_BUILD_DIR) + cp -af $(DL_DIR)/$(TTCP_SOURCE) $(TTCP_BUILD_DIR) + touch $(TTCP_BUILD_DIR)/.unpacked + +$(TTCP_BUILD_DIR)/.configured: $(TTCP_BUILD_DIR)/.unpacked + touch $(TTCP_BUILD_DIR)/.configured + +$(TTCP_BUILD_DIR)/ttcp: $(TTCP_BUILD_DIR)/.configured + $(TARGET_CC) -O2 -o $(TTCP_BUILD_DIR)/ttcp $(TTCP_BUILD_DIR)/$(TTCP_SOURCE) + +$(TARGET_DIR)/usr/bin/ttcp: $(TTCP_BUILD_DIR)/ttcp + cp -af $(TTCP_BUILD_DIR)/ttcp $(TARGET_DIR)/usr/bin/ + +ttcp: $(TARGET_DIR)/usr/bin/ttcp + +ttcp-source: $(DL_DIR)/$(TTCP_SOURCE) + +ttcp-clean: + rm -f $(TTCP_BUILD_DIR)/*.o $(TTCP_BUILD_DIR)/ttcp + +ttcp-dirclean: + rm -rf $(TTCP_BUILD_DIR) + diff --git a/obsolete-buildroot/make/uclibc.mk b/obsolete-buildroot/make/uclibc.mk new file mode 100644 index 0000000000..1e18d6894b --- /dev/null +++ b/obsolete-buildroot/make/uclibc.mk @@ -0,0 +1,184 @@ +############################################################# +# +# uClibc (the C library) +# +############################################################# +ifneq ($(strip $(USE_UCLIBC_SNAPSHOT)),) +# Be aware that this changes daily.... +UCLIBC_DIR:=$(BUILD_DIR)/uClibc +UCLIBC_SOURCE:=uClibc-$(strip $(USE_UCLIBC_SNAPSHOT)).tar.bz2 +UCLIBC_SITE:=http://www.uclibc.org/downloads/snapshots +else +UCLIBC_DIR:=$(BUILD_DIR)/uClibc-0.9.26 +UCLIBC_SOURCE:=uClibc-0.9.26.tar.bz2 +UCLIBC_SITE:=http://www.uclibc.org/downloads +endif + +UCLIBC_TARGET_ARCH:=$(shell echo $(ARCH) | sed -e s'/-.*//' \ + -e 's/i.86/i386/' \ + -e 's/sparc.*/sparc/' \ + -e 's/arm.*/arm/g' \ + -e 's/m68k.*/m68k/' \ + -e 's/ppc/powerpc/g' \ + -e 's/v850.*/v850/g' \ + -e 's/sh64/sh/' \ + -e 's/sh[234]/sh/' \ + -e 's/mips.*/mips/' \ + -e 's/mipsel.*/mips/' \ + -e 's/cris.*/cris/' \ +) + + +$(DL_DIR)/$(UCLIBC_SOURCE): + $(WGET) -P $(DL_DIR) $(UCLIBC_SITE)/$(UCLIBC_SOURCE) + +$(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE) +ifeq ($(SOFT_FLOAT),true) + # Make sure we have a soft float specs file for this arch + if [ ! -f $(SOURCE_DIR)/specs-$(ARCH)-soft-float ] ; then \ + echo soft float configured but no specs file for this arch ; \ + /bin/false ; \ + fi; +endif + bzcat $(DL_DIR)/$(UCLIBC_SOURCE) | tar -C $(BUILD_DIR) -xvf - + #(cd $(BUILD_DIR) ; ln -s $(DL_DIR)/uClibc) + #-mkdir $(UCLIBC_DIR) + #(cd $(DL_DIR)/uClibc && tar cf - .) | (cd $(UCLIBC_DIR) && tar xvfp - ) +ifeq ($(strip $(USE_UCLIBC_LDSO_0_9_24)),true) + $(SOURCE_DIR)/patch-kernel.sh $(UCLIBC_DIR) $(SOURCE_DIR) uClibc-ldso-0.9.24.patch +endif + touch $(UCLIBC_DIR)/.unpacked + +$(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.unpacked $(LINUX_DIR)/.configured + $(SED) 's,^CROSS=.*,CROSS=$(TARGET_CROSS),g' $(UCLIBC_DIR)/Rules.mak +ifeq ($(ENABLE_LOCALE),true) + cp $(SOURCE_DIR)/uClibc.config-locale $(UCLIBC_DIR)/.config +else + cp $(SOURCE_DIR)/uClibc.config $(UCLIBC_DIR)/.config +endif + $(SED) 's,^.*TARGET_$(UCLIBC_TARGET_ARCH).*,TARGET_$(UCLIBC_TARGET_ARCH)=y,g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^TARGET_ARCH.*,TARGET_ARCH=\"$(UCLIBC_TARGET_ARCH)\",g' $(UCLIBC_DIR)/.config + $(SED) 's,^KERNEL_SOURCE=.*,KERNEL_SOURCE=\"$(LINUX_DIR)\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^RUNTIME_PREFIX=.*,RUNTIME_PREFIX=\"/\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^DEVEL_PREFIX=.*,DEVEL_PREFIX=\"/usr/\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^SHARED_LIB_LOADER_PREFIX=.*,SHARED_LIB_LOADER_PREFIX=\"/lib\",g' \ + $(UCLIBC_DIR)/.config +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) + $(SED) 's,^.*UCLIBC_HAS_LFS.*,UCLIBC_HAS_LFS=y,g' $(UCLIBC_DIR)/.config +else + $(SED) 's,^.*UCLIBC_HAS_LFS.*,UCLIBC_HAS_LFS=n,g' $(UCLIBC_DIR)/.config +endif + $(SED) 's,.*UCLIBC_HAS_WCHAR.*,UCLIBC_HAS_WCHAR=y,g' $(UCLIBC_DIR)/.config +ifeq ($(strip $(SOFT_FLOAT)),true) + $(SED) 's,.*HAS_FPU.*,HAS_FPU=n\nUCLIBC_HAS_FLOATS=y\nUCLIBC_HAS_SOFT_FLOAT=y,g' $(UCLIBC_DIR)/.config +endif + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/usr/include + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/usr/lib + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/lib + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + HOSTCC="$(HOSTCC)" \ + pregen install_dev; + touch $(UCLIBC_DIR)/.configured + +$(UCLIBC_DIR)/lib/libc.a: $(UCLIBC_DIR)/.configured $(LIBFLOAT_TARGET) + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX= \ + DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ + RUNTIME_PREFIX=/ \ + HOSTCC="$(HOSTCC)" \ + all +ifeq ($(strip $(USE_UCLIBC_LDSO_0_9_24)),true) + #rm -rf $(UCLIBC_DIR)/ld-uClibc* $(UCLIBC_DIR)/libdl* + $(MAKE) -C $(UCLIBC_DIR)/ldso-0.9.24 \ + PREFIX= \ + DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ + RUNTIME_PREFIX=/ \ + HOSTCC="$(HOSTCC)" \ + all shared +endif + +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a: $(UCLIBC_DIR)/lib/libc.a + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR)/ \ + DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ + RUNTIME_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ + install_runtime + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR)/ \ + DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ + RUNTIME_PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/ \ + install_dev + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR) \ + HOSTCC="$(HOSTCC)" \ + utils install_utils + # Clean up the host compiled utils... + $(MAKE) -C $(UCLIBC_DIR)/utils clean + +ifneq ($(TARGET_DIR),) +$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX=$(TARGET_DIR) \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=/ \ + install_runtime + +$(TARGET_DIR)/usr/bin/ldd: $(TARGET_DIR)/lib/libc.so.0 + $(MAKE) -C $(UCLIBC_DIR) $(TARGET_CONFIGURE_OPTS) \ + PREFIX=$(TARGET_DIR) utils install_utils + +UCLIBC_TARGETS=$(TARGET_DIR)/lib/libc.so.0 $(TARGET_DIR)/usr/bin/ldd +endif + +uclibc-configured: $(UCLIBC_DIR)/.configured + +uclibc: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a \ + $(UCLIBC_TARGETS) + +uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) + +uclibc-configured-source: uclibc-source + +uclibc-clean: + -$(MAKE) -C $(UCLIBC_DIR) clean + rm -f $(UCLIBC_DIR)/.config + +uclibc-dirclean: + rm -rf $(UCLIBC_DIR) + + + + +############################################################# +# +# uClibc for the target just needs its header files +# and whatnot installed. +# +############################################################# + +$(TARGET_DIR)/usr/lib/libc.a: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + $(MAKE) -C $(UCLIBC_DIR) \ + PREFIX=$(TARGET_DIR) \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=/ \ + install_dev + +ifeq ($(GCC_2_95_TOOLCHAIN),true) +uclibc_target: gcc2_95 uclibc $(TARGET_DIR)/usr/lib/libc.a +else +uclibc_target: gcc3_3 uclibc $(TARGET_DIR)/usr/lib/libc.a +endif + +uclibc_target-clean: + rm -f $(TARGET_DIR)/include + +uclibc_target-dirclean: + rm -f $(TARGET_DIR)/include + diff --git a/obsolete-buildroot/make/udhcp.mk b/obsolete-buildroot/make/udhcp.mk new file mode 100644 index 0000000000..46cb203d0f --- /dev/null +++ b/obsolete-buildroot/make/udhcp.mk @@ -0,0 +1,64 @@ +############################################################# +# +# uchdp DHCP client and/or server +# +############################################################# +# Copyright (C) 2001-2003 by Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 + +UDHCP_SOURCE:=udhcp-0.9.8.tar.gz +UDHCP_SITE:=http://udhcp.busybox.net/downloads/ +UDHCP_DIR:=$(BUILD_DIR)/udhcp-0.9.8 + +$(DL_DIR)/$(UDHCP_SOURCE): + $(WGET) -P $(DL_DIR) $(UDHCP_SITE)/$(UDHCP_SOURCE) + +udhcp-source: $(DL_DIR)/$(UDHCP_SOURCE) + +$(UDHCP_DIR)/.unpacked: $(DL_DIR)/$(UDHCP_SOURCE) + zcat $(DL_DIR)/$(UDHCP_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(UDHCP_DIR)/.unpacked + +#$(UDHCP_DIR)/.unpacked: +# (cd $(BUILD_DIR); \ +# CVS_PASSFILE=$(CVS_PASSFILE) \ +# cvs -z3 -d:pserver:anonymous@busybox.net:/var/cvs co udhcp ) +# touch $(UDHCP_DIR)/.unpacked + +$(UDHCP_DIR)/udhcpc: $(UDHCP_DIR)/.unpacked + $(MAKE) CROSS_COMPILE="$(TARGET_CROSS)" prefix="$(TARGET_DIR)" -C $(UDHCP_DIR) + +$(TARGET_DIR)/sbin/udhcpc: $(UDHCP_DIR)/udhcpc + $(SED) 's/pump/udhcpc/' $(TARGET_DIR)/etc/pcmcia/network* + $(SED) 's/PUMP/UDHCPC/' $(TARGET_DIR)/etc/pcmcia/network* + $(SED) 's/DHCP="n"/DHCP="y"/' $(TARGET_DIR)/etc/pcmcia/network* + mkdir -p $(TARGET_DIR)/sbin + rm -f $(TARGET_DIR)/sbin/udhcpc + cp $(UDHCP_DIR)/udhcpc $(TARGET_DIR)/sbin/ + mkdir -p $(TARGET_DIR)/usr/share/udhcpc + cp $(UDHCP_DIR)/samples/simple.script $(TARGET_DIR)/usr/share/udhcpc/default.script + chmod a+x $(TARGET_DIR)/sbin/udhcpc $(TARGET_DIR)/usr/share/udhcpc/default.script + +udhcp: uclibc $(TARGET_DIR)/sbin/udhcpc + +udhcp-clean: + rm -f $(TARGET_DIR)/sbin/udhcpc + -$(MAKE) -C $(UDHCP_DIR) clean + +udhcp-dirclean: + rm -rf $(UDHCP_DIR) diff --git a/obsolete-buildroot/make/util-linux.mk b/obsolete-buildroot/make/util-linux.mk new file mode 100644 index 0000000000..c29a8403b7 --- /dev/null +++ b/obsolete-buildroot/make/util-linux.mk @@ -0,0 +1,69 @@ +############################################################# +# +# util-linux +# +############################################################# +UTIL-LINUX_SOURCE:=util-linux_2.12.orig.tar.gz +UTIL-LINUX_SITE:=http://ftp.debian.org/debian/pool/main/u/util-linux/ +UTIL-LINUX_PATCH:=util-linux_2.12-6.diff.gz +UTIL-LINUX_CAT:=zcat +UTIL-LINUX_DIR:=$(BUILD_DIR)/util-linux-2.12 +UTIL-LINUX_BINARY:=$(UTIL-LINUX_DIR)/misc-utils/mcookie +UTIL-LINUX_TARGET_BINARY:=$(TARGET_DIR)/usr/bin/mcookie + +$(DL_DIR)/$(UTIL-LINUX_SOURCE): + $(WGET) -P $(DL_DIR) $(UTIL-LINUX_SITE)/$(UTIL-LINUX_SOURCE) + +$(DL_DIR)/$(UTIL-LINUX_PATCH): + $(WGET) -P $(DL_DIR) $(UTIL-LINUX_SITE)/$(UTIL-LINUX_PATCH) + +$(UTIL-LINUX_DIR)/.unpacked: $(DL_DIR)/$(UTIL-LINUX_SOURCE) $(DL_DIR)/$(UTIL-LINUX_PATCH) + $(UTIL-LINUX_CAT) $(DL_DIR)/$(UTIL-LINUX_SOURCE) | tar -C $(BUILD_DIR) -xvf - + $(UTIL-LINUX_CAT) $(DL_DIR)/$(UTIL-LINUX_PATCH) | patch -p1 -d $(UTIL-LINUX_DIR) + cat $(SOURCE_DIR)/util-linux.patch | patch -p1 -d $(UTIL-LINUX_DIR) + touch $(UTIL-LINUX_DIR)/.unpacked + +$(UTIL-LINUX_DIR)/.configured: $(UTIL-LINUX_DIR)/.unpacked + (cd $(UTIL-LINUX_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ARCH=$(ARCH) \ + ); + $(SED) "s,^INSTALLSUID=.*,INSTALLSUID=\\$$\(INSTALL\) -m \\$$\(BINMODE\)," \ + $(UTIL-LINUX_DIR)/MCONFIG + $(SED) "s,^USE_TTY_GROUP=.*,USE_TTY_GROUP=no," $(UTIL-LINUX_DIR)/MCONFIG + touch $(UTIL-LINUX_DIR)/.configured + +$(UTIL-LINUX_BINARY): $(UTIL-LINUX_DIR)/.configured + $(MAKE) ARCH=$(ARCH) CC=$(TARGET_CC) -C $(UTIL-LINUX_DIR) + +$(UTIL-LINUX_TARGET_BINARY): $(UTIL-LINUX_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) USE_TTY_GROUP=no -C $(UTIL-LINUX_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +util-linux: uclibc $(UTIL-LINUX_TARGET_BINARY) + +util-linux-source: $(DL_DIR)/$(UTIL-LINUX_SOURCE) + +util-linux-clean: + #There is no working 'uninstall' target. Just skip it... + #$(MAKE) DESTDIR=$(TARGET_DIR) -C $(UTIL-LINUX_DIR) uninstall + -$(MAKE) -C $(UTIL-LINUX_DIR) clean + +util-linux-dirclean: + rm -rf $(UTIL-LINUX_DIR) + + diff --git a/obsolete-buildroot/make/valgrind.mk b/obsolete-buildroot/make/valgrind.mk new file mode 100644 index 0000000000..ed295a3cfb --- /dev/null +++ b/obsolete-buildroot/make/valgrind.mk @@ -0,0 +1,88 @@ +############################################################# +# +# valgrind +# +############################################################# + +VALGRIND_SITE:=http://developer.kde.org/~sewardj/ +VALGRIND_DIR:=$(BUILD_DIR)/valgrind-2.1.1 +VALGRIND_SOURCE:=valgrind-2.1.1.tar.bz2 +VALGRIND_PATCH:=$(SOURCE_DIR)/valgrind.patch + +$(DL_DIR)/$(VALGRIND_SOURCE): + $(WGET) -P $(DL_DIR) $(VALGRIND_SITE)/$(VALGRIND_SOURCE) + +$(VALGRIND_DIR)/.unpacked: $(DL_DIR)/$(VALGRIND_SOURCE) + bzcat $(DL_DIR)/$(VALGRIND_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(VALGRIND_DIR)/.unpacked + +$(VALGRIND_DIR)/.patched: $(VALGRIND_DIR)/.unpacked + cat $(VALGRIND_PATCH) | patch -d $(VALGRIND_DIR) -p1 + touch $(VALGRIND_DIR)/.patched + +$(VALGRIND_DIR)/.configured: $(VALGRIND_DIR)/.patched + (cd $(VALGRIND_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --without-uiout --disable-valgrindmi \ + --disable-tui --disable-valgrindtk \ + --without-x --without-included-gettext \ + ); + touch $(VALGRIND_DIR)/.configured + +$(VALGRIND_DIR)/coregrind/valgrind.so: $(VALGRIND_DIR)/.configured + $(MAKE) -C $(VALGRIND_DIR) + -$(STRIP) --strip-unneeded $(VALGRIND_DIR)/*.so* + touch -c $(VALGRIND_DIR)/coregrind/valgrind.so + +$(TARGET_DIR)/usr/bin/valgrind: $(VALGRIND_DIR)/coregrind/valgrind.so + $(MAKE) \ + prefix=$(TARGET_DIR)/usr \ + exec_prefix=$(TARGET_DIR)/usr \ + bindir=$(TARGET_DIR)/usr/bin \ + sbindir=$(TARGET_DIR)/usr/sbin \ + libexecdir=$(TARGET_DIR)/usr/lib \ + datadir=$(TARGET_DIR)/usr/share \ + sysconfdir=$(TARGET_DIR)/etc \ + sharedstatedir=$(TARGET_DIR)/usr/com \ + localstatedir=$(TARGET_DIR)/var \ + libdir=$(TARGET_DIR)/usr/lib \ + infodir=$(TARGET_DIR)/usr/info \ + mandir=$(TARGET_DIR)/usr/man \ + includedir=$(TARGET_DIR)/usr/include \ + -C $(VALGRIND_DIR) install; + rm -rf $(TARGET_DIR)/usr/share/doc/valgrind + #mkdir -p $(TARGET_DIR)/etc/default + #cp $(VALGRIND_DIR)/valgrind.default $(TARGET_DIR)/etc/default/valgrind + #mkdir -p $(TARGET_DIR)/usr/lib/valgrind + #cp $(VALGRIND_DIR)/woody.supp $(TARGET_DIR)/usr/lib/valgrind/ + touch -c $(TARGET_DIR)/usr/bin/valgrind + +ifeq ($(ARCH),i386) +valgrind: $(TARGET_DIR)/usr/bin/valgrind +else +valgrind: +endif + +valgrind-source: $(DL_DIR)/$(VALGRIND_SOURCE) + +valgrind-clean: + $(MAKE) -C $(VALGRIND_DIR) clean + +valgrind-dirclean: + rm -rf $(VALGRIND_DIR) + diff --git a/obsolete-buildroot/make/vtun.mk b/obsolete-buildroot/make/vtun.mk new file mode 100644 index 0000000000..595a6f82b2 --- /dev/null +++ b/obsolete-buildroot/make/vtun.mk @@ -0,0 +1,66 @@ +############################################################# +# +# vtun +# +# NOTE: Uses start-stop-daemon in init script, so be sure +# to enable that within busybox +# +############################################################# +VTUN_SOURCE:=vtun-2.6.tar.gz +VTUN_SITE:=http://aleron.dl.sourceforge.net/sourceforge/vtun/ +VTUN_DIR:=$(BUILD_DIR)/vtun-2.6 +VTUN_CAT:=zcat +VTUN_BINARY:=vtund +VTUN_TARGET_BINARY:=usr/sbin/vtund +VTUN_PATCH:=$(SOURCE_DIR)/vtun.patch + +$(DL_DIR)/$(VTUN_SOURCE): + $(WGET) -P $(DL_DIR) $(VTUN_SITE)/$(VTUN_SOURCE) + +vtun-source: $(DL_DIR)/$(VTUN_SOURCE) + +$(VTUN_DIR)/.unpacked: $(DL_DIR)/$(VTUN_SOURCE) + $(VTUN_CAT) $(DL_DIR)/$(VTUN_SOURCE) | tar -C $(BUILD_DIR) -xvf - + mv $(BUILD_DIR)/vtun $(VTUN_DIR) + cat $(VTUN_PATCH) | patch -p1 -d $(VTUN_DIR) + touch $(VTUN_DIR)/.unpacked + +$(VTUN_DIR)/.configured: $(VTUN_DIR)/.unpacked zlib lzo openssl + (cd $(VTUN_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --with-ssl-headers=$(STAGING_DIR)/include/openssl \ + --with-lzo-headers=$(STAGING_DIR)/include \ + ); + touch $(VTUN_DIR)/.configured + +$(VTUN_DIR)/$(VTUN_BINARY): $(VTUN_DIR)/.configured + $(MAKE) -C $(VTUN_DIR) + +$(TARGET_DIR)/$(VTUN_TARGET_BINARY): $(VTUN_DIR)/$(VTUN_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(VTUN_DIR) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + +vtun: uclibc $(TARGET_DIR)/$(VTUN_TARGET_BINARY) + +vtun-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(VTUN_DIR) uninstall + -$(MAKE) -C $(VTUN_DIR) clean + +vtun-dirclean: + rm -rf $(VTUN_DIR) + diff --git a/obsolete-buildroot/make/wtools.mk b/obsolete-buildroot/make/wtools.mk new file mode 100644 index 0000000000..53ed4ff574 --- /dev/null +++ b/obsolete-buildroot/make/wtools.mk @@ -0,0 +1,50 @@ +############################################################# +# +# wtools - Wireless Tools +# +############################################################# +# +WTOOLS_SOURCE_URL=http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux +WTOOLS_SOURCE=wireless_tools.26.tar.gz +WTOOLS_BUILD_DIR=$(BUILD_DIR)/wireless_tools.26 + +$(DL_DIR)/$(WTOOLS_SOURCE): + $(WGET) -P $(DL_DIR) $(WTOOLS_SOURCE_URL)/$(WTOOLS_SOURCE) + +$(WTOOLS_BUILD_DIR)/.unpacked: $(DL_DIR)/$(WTOOLS_SOURCE) + zcat $(DL_DIR)/$(WTOOLS_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(WTOOLS_BUILD_DIR)/.unpacked + +$(WTOOLS_BUILD_DIR)/.configured: $(WTOOLS_BUILD_DIR)/.unpacked + touch $(WTOOLS_BUILD_DIR)/.configured + +$(WTOOLS_BUILD_DIR)/iwconfig: $(WTOOLS_BUILD_DIR)/.configured + $(MAKE) -C $(WTOOLS_BUILD_DIR) \ + CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \ + BUILD_SHARED=y # may want to make this an option + +$(TARGET_DIR)/sbin/iwconfig: $(WTOOLS_BUILD_DIR)/iwconfig + # Copy The Wireless Tools + cp -af $(WTOOLS_BUILD_DIR)/iwconfig $(TARGET_DIR)/sbin/ + cp -af $(WTOOLS_BUILD_DIR)/iwevent $(TARGET_DIR)/sbin/ + cp -af $(WTOOLS_BUILD_DIR)/iwgetid $(TARGET_DIR)/sbin/ + cp -af $(WTOOLS_BUILD_DIR)/iwlist $(TARGET_DIR)/sbin/ + cp -af $(WTOOLS_BUILD_DIR)/iwpriv $(TARGET_DIR)/sbin/ + cp -af $(WTOOLS_BUILD_DIR)/iwspy $(TARGET_DIR)/sbin/ + cp -af $(WTOOLS_BUILD_DIR)/libiw.so.26 $(TARGET_DIR)/lib + $(STRIP) $(TARGET_DIR)/sbin/iwconfig $(TARGET_DIR)/sbin/iwevent \ + $(TARGET_DIR)/sbin/iwgetid $(TARGET_DIR)/sbin/iwlist \ + $(TARGET_DIR)/sbin/iwpriv $(TARGET_DIR)/sbin/iwspy \ + $(TARGET_DIR)/lib/libiw.so.26 + +wtools: $(TARGET_DIR)/sbin/iwconfig + +wtools-source: $(DL_DIR)/$(WTOOLS_SOURCE) + +wtools-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(WTOOLS_BUILD_DIR) uninstall + -$(MAKE) -C $(WTOOLS_BUILD_DIR) clean + +wtools-dirclean: + rm -rf $(WTOOLS_BUILD_DIR) + diff --git a/obsolete-buildroot/make/zlib.mk b/obsolete-buildroot/make/zlib.mk new file mode 100644 index 0000000000..90c6915aa1 --- /dev/null +++ b/obsolete-buildroot/make/zlib.mk @@ -0,0 +1,72 @@ +############################################################# +# +# zlib +# +############################################################# +ZLIB_SOURCE=zlib-1.1.4.tar.bz2 +ZLIB_SITE=http://aleron.dl.sourceforge.net/sourceforge/libpng +ZLIB_DIR=$(BUILD_DIR)/zlib-1.1.4 +ZLIB_CFLAGS= $(TARGET_CFLAGS) -fPIC +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +ZLIB_CFLAGS+= -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 +endif + +$(DL_DIR)/$(ZLIB_SOURCE): + $(WGET) -P $(DL_DIR) $(ZLIB_SITE)/$(ZLIB_SOURCE) + +$(ZLIB_DIR)/.source: $(DL_DIR)/$(ZLIB_SOURCE) + bzcat $(DL_DIR)/$(ZLIB_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(ZLIB_DIR)/.source + +$(ZLIB_DIR)/.configured: $(ZLIB_DIR)/.source + (cd $(ZLIB_DIR); \ + ./configure \ + --shared \ + --prefix=/usr \ + --exec-prefix=$(STAGING_DIR)/usr/bin \ + --libdir=$(STAGING_DIR)/lib \ + --includedir=$(STAGING_DIR)/include \ + ); + touch $(ZLIB_DIR)/.configured; + +$(ZLIB_DIR)/libz.so.1.1.4: $(ZLIB_DIR)/.configured + $(MAKE) LDSHARED="$(TARGET_CROSS)ld -shared -soname,libz.so.1" \ + CFLAGS="$(ZLIB_CFLAGS)" CC=$(TARGET_CC) -C $(ZLIB_DIR) all libz.a; + touch -c $(ZLIB_DIR)/libz.so.1.1.4 + +$(STAGING_DIR)/lib/libz.so.1.1.4: $(ZLIB_DIR)/libz.so.1.1.4 + cp -dpf $(ZLIB_DIR)/libz.a $(STAGING_DIR)/lib; + cp -dpf $(ZLIB_DIR)/zlib.h $(STAGING_DIR)/include; + cp -dpf $(ZLIB_DIR)/zconf.h $(STAGING_DIR)/include; + cp -dpf $(ZLIB_DIR)/libz.so* $(STAGING_DIR)/lib; + (cd $(STAGING_DIR)/lib; ln -fs libz.so.1.1.4 libz.so.1); + chmod a-x $(STAGING_DIR)/lib/libz.so.1.1.4 + touch -c $(STAGING_DIR)/lib/libz.so.1.1.4 + +$(TARGET_DIR)/lib/libz.so.1.1.4: $(STAGING_DIR)/lib/libz.so.1.1.4 + cp -dpf $(STAGING_DIR)/lib/libz.so* $(TARGET_DIR)/lib; + -$(STRIP) --strip-unneeded $(TARGET_DIR)/lib/libz.so* + touch -c $(TARGET_DIR)/lib/libz.so.1.1.4 + +$(TARGET_DIR)/usr/lib/libz.a: $(STAGING_DIR)/lib/libz.so.1.1.4 + mkdir -p $(TARGET_DIR)/usr/include + cp -dpf $(STAGING_DIR)/include/zlib.h $(TARGET_DIR)/usr/include/ + cp -dpf $(STAGING_DIR)/include/zconf.h $(TARGET_DIR)/usr/include/ + cp -dpf $(STAGING_DIR)/lib/libz.a $(TARGET_DIR)/usr/lib/ + rm -f $(TARGET_DIR)/lib/libz.so + (cd $(TARGET_DIR)/usr/lib; ln -fs /lib/libz.so.1.1.4 libz.so) + touch -c $(TARGET_DIR)/usr/lib/libz.a + +zlib-headers: $(TARGET_DIR)/usr/lib/libz.a + +zlib: uclibc $(TARGET_DIR)/lib/libz.so.1.1.4 + +zlib-source: $(DL_DIR)/$(ZLIB_SOURCE) + +zlib-clean: + rm -f $(TARGET_DIR)/lib/libz.so* + -$(MAKE) -C $(ZLIB_DIR) clean + +zlib-dirclean: + rm -rf $(ZLIB_DIR) + diff --git a/obsolete-buildroot/sources/.cvsignore b/obsolete-buildroot/sources/.cvsignore new file mode 100644 index 0000000000..5c488628e4 --- /dev/null +++ b/obsolete-buildroot/sources/.cvsignore @@ -0,0 +1 @@ +dl diff --git a/obsolete-buildroot/sources/STLport-4.5.3.patch b/obsolete-buildroot/sources/STLport-4.5.3.patch new file mode 100644 index 0000000000..fee65f9200 --- /dev/null +++ b/obsolete-buildroot/sources/STLport-4.5.3.patch @@ -0,0 +1,407 @@ +diff -urN STLport-4.5.3/Makefile STLport-4.5.3-devel/Makefile +--- STLport-4.5.3/Makefile Wed Dec 31 17:00:00 1969 ++++ STLport-4.5.3-devel/Makefile Tue Jan 7 15:28:08 2003 +@@ -0,0 +1,44 @@ ++# Makefile to compile stlport with uClibc ++# ++# Copyright (C) 2002 Erik Andersen ++# ++# 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 ++ ++ARCH:=i386 ++PREFIX:=/usr/$(ARCH)-linux-uclibc ++CROSS:= $(PREFIX)/../bin/$(ARCH)-linux-uclibc- ++CC=$(CROSS)gcc ++CXX=$(CROSS)g++ ++AR = $(CROSS)ar ++STRIP = $(CROSS)strip --remove-section=.comment --remove-section=.note --strip-unneeded ++.EXPORT_ALL_VARIABLES: ++ ++all: ++ rm -f lib/lib* ++ make -C src -f gcc-uClibc.mak all ++ (cd lib; rm -f libstdc++_debug.so; \ ++ ln -fs libstdc++.so.4.5 libstdc++.so; \ ++ ln -fs libstdc++.so.4.5 libstdc++.so.0;) ++ $(STRIP) lib/libstdc++.so.4.5; ++ ++clean: ++ make -C src -f gcc-uClibc.mak clean ++ rm -rf lib/* ++ ++install: ++ (cd lib; \ ++ cp -a libstdc++.a $(PREFIX)/lib; \ ++ cp -a libstdc++.so libstdc++.so.0 libstdc++.so.4.5 $(PREFIX)/lib;) ++ cp -a stlport $(PREFIX)/include/c++ +diff -urN STLport-4.5.3/src/dll_main.cpp STLport-4.5.3-devel/src/dll_main.cpp +--- STLport-4.5.3/src/dll_main.cpp Sat Feb 2 16:11:56 2002 ++++ STLport-4.5.3-devel/src/dll_main.cpp Tue Jan 7 15:28:08 2003 +@@ -52,7 +52,7 @@ + # include + # endif + +-# if defined (_STLP_UNIX) ++# if defined (_STLP_UNIX) && defined (_STLP_PTHREADS) && ! defined (_STLP_USE_UCLIBC) + # define _STLP_HAS_PERTHREAD_ALLOCATOR + # include + # endif +diff -urN STLport-4.5.3/src/gcc-uClibc.mak STLport-4.5.3-devel/src/gcc-uClibc.mak +--- STLport-4.5.3/src/gcc-uClibc.mak Wed Dec 31 17:00:00 1969 ++++ STLport-4.5.3-devel/src/gcc-uClibc.mak Tue Jan 7 15:28:08 2003 +@@ -0,0 +1,61 @@ ++# ++# Basename for libraries ++# ++LIB_BASENAME:=libstdc++ ++LIB_SHAREDNAME:=$(LIB_BASENAME).so ++LIB_SHAREDNAME_FULL:=$(LIB_SHAREDNAME).0 ++ ++# ++# guts for common stuff ++# ++# ++LINK:=$(AR) -cr ++#DYN_LINK:=$(CC) -fno-exceptions -lpthread -lm -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o ++DYN_LINK:=$(CC) -fno-exceptions -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o ++ ++OBJEXT=o ++DYNEXT=so ++STEXT=a ++RM=rm -rf ++PATH_SEP=/ ++MKDIR=mkdir -p ++COMP=GCC$(ARCH) ++INSTALL_STEP = install_unix ++ ++all: release_dynamic release_static ++#all: all_dynamic all_static symbolic_links ++ ++include common_macros.mak ++STLDEBUG_NAME:=$(LIB_BASENAME).debug ++ ++# Lets disable exception support, since this saves over 200k... ++DEFINE_FLAGS:= -fno-exceptions ++#DEFINE_FLAGS:= -D_STLP_NO_EXCEPTIONS -fno-exceptions -DSTL_NO_EXCEPTIONS ++ ++#DEFINE_FLAGS+= -D_STLP_USE_UCLIBC -D_STLP_NO_WCHAR_T \ ++# -DUSE_SPRINTF_INSTEAD -D_ISOC99_SOURCE ++ ++WARNING_FLAGS:= -W -Wno-sign-compare -Wno-unused -Wno-uninitialized ++INCLUDE_FLAGS = -I${STLPORT_DIR} ++CXXFLAGS_COMMON = $(WARNING_FLAGS) $(DEFINE_FLAGS) $(INCLUDE_FLAGS) ++ ++CXXFLAGS_RELEASE_static = $(CXXFLAGS_COMMON) -Os ++CXXFLAGS_RELEASE_dynamic = $(CXXFLAGS_COMMON) -Os -fPIC ++ ++CXXFLAGS_DEBUG_static = $(CXXFLAGS_COMMON) -O -g ++CXXFLAGS_DEBUG_dynamic = $(CXXFLAGS_COMMON) -O -g -fPIC ++ ++CXXFLAGS_STLDEBUG_static = $(CXXFLAGS_DEBUG_static) -D_STLP_DEBUG ++CXXFLAGS_STLDEBUG_dynamic = $(CXXFLAGS_DEBUG_dynamic) -D_STLP_DEBUG -fPIC ++ ++include common_percent_rules.mak ++include common_rules.mak ++ ++ ++#install: all ++# cp -p $(LIB_TARGET) ${D_LIB_TARGET} ../lib ++ ++#%.s: %.cpp ++# $(CXX) $(CXXFLAGS) -O4 -S -pto $< -o $@ ++ ++ +diff -urN STLport-4.5.3/src/num_put_float.cpp STLport-4.5.3-devel/src/num_put_float.cpp +--- STLport-4.5.3/src/num_put_float.cpp Fri Jan 18 15:06:52 2002 ++++ STLport-4.5.3-devel/src/num_put_float.cpp Tue Jan 7 15:28:08 2003 +@@ -65,6 +65,12 @@ + + # endif + ++# if defined(_STLP_USE_UCLIBC) ++# define __USE_ISOC99 1 ++# include ++# include ++# endif ++ + # include + + #if defined (_MSC_VER) || defined (__MINGW32__) || defined (__BORLANDC__) || defined (__DJGPP) || defined (_STLP_SCO_OPENSERVER) || defined (__NCR_SVR) +@@ -209,7 +215,7 @@ + + #ifdef USE_SPRINTF_INSTEAD + +-#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) ++#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) || defined (_STLP_USE_UCLIBC) + # if defined (isfinite) + inline bool _Stl_is_nan_or_inf(double x) { return !isfinite(x); } + # else +@@ -238,7 +244,7 @@ + } + inline bool _Stl_is_neg_inf(double x) { return _fpclass(x) == _FPCLASS_NINF; } + inline bool _Stl_is_neg_nan(double x) { return _isnan(x) && _copysign(1., x) < 0 ; } +-#elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW ++#elif defined(__MRC__) || defined(__SC__) + bool _Stl_is_nan_or_inf(double x) { return isnan(x) || !isfinite(x); } + bool _Stl_is_inf(double x) { return !isfinite(x); } + bool _Stl_is_neg_inf(double x) { return !isfinite(x) && signbit(x); } +@@ -280,7 +286,7 @@ + inline char* _Stl_qfcvtR(long double x, int n, int* pt, int* sign, char* buf) + { return fcvtbuf(x, n, pt, sign, buf); } + # endif +-#elif defined (_STLP_USE_GLIBC) ++#elif defined (_STLP_USE_GLIBC) || defined(_STLP_USE_UCLIBC) + inline char* _Stl_ecvtR(double x, int n, int* pt, int* sign, char* buf) + { return buf + ecvt_r(x, n, pt, sign, buf, NDIG+2); } + inline char* _Stl_fcvtR(double x, int n, int* pt, int* sign, char* buf) +diff -urN STLport-4.5.3/src/stdio_streambuf.cpp STLport-4.5.3-devel/src/stdio_streambuf.cpp +--- STLport-4.5.3/src/stdio_streambuf.cpp Thu Jan 10 11:41:52 2002 ++++ STLport-4.5.3-devel/src/stdio_streambuf.cpp Tue Jan 7 15:28:08 2003 +@@ -82,7 +82,7 @@ + _STLP_VENDOR_CSTD::fgetpos(_M_file, &pos); + // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead + // of a primitive type +-#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) ++#if defined(_STLP_USE_UCLIBC) || (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) + return pos_type((streamoff)pos.__pos); + #elif defined(__ISCPP__) || defined(__MVS__) || (__OS400__) + return pos_type(pos.__fpos_elem[ 0 ]); +@@ -101,13 +101,16 @@ + + // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead + // of a primitive type +-#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) ++#if (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) + fpos_t p; + p.__pos = pos; + memset( &(p.__state), 0, sizeof(p.__state) ); + #elif defined(__MVS__) || (__OS400__) + fpos_t p; + p.__fpos_elem[0] = pos; ++#elif defined(_STLP_USE_UCLIBC) ++ fpos_t p; ++ p.__pos = pos; + #else + fpos_t p(pos); + #endif +diff -urN STLport-4.5.3/stlport/config/_prolog.h STLport-4.5.3-devel/stlport/config/_prolog.h +--- STLport-4.5.3/stlport/config/_prolog.h Sun Oct 28 13:26:44 2001 ++++ STLport-4.5.3-devel/stlport/config/_prolog.h Tue Jan 7 15:28:08 2003 +@@ -1,3 +1,8 @@ ++/* Evil hack to make sure everything behaves itself */ ++#define _STLP_USE_UCLIBC ++//#define _STLP_NO_WCHAR_T ++//#define _ISOC99_SOURCE ++//#define USE_SPRINTF_INSTEAD + + #if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__) + +diff -urN STLport-4.5.3/stlport/config/stl_gcc.h STLport-4.5.3-devel/stlport/config/stl_gcc.h +--- STLport-4.5.3/stlport/config/stl_gcc.h Thu Jan 10 11:41:58 2002 ++++ STLport-4.5.3-devel/stlport/config/stl_gcc.h Tue Jan 7 15:28:08 2003 +@@ -3,7 +3,7 @@ + */ + + /* Systems having GLIBC installed have different traits */ +-#if ! defined (_STLP_USE_GLIBC) && ( defined (__linux__) || defined (__CYGWIN__) ) ++#if ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC) && ( defined (__linux__) || defined (__CYGWIN__) ) + # define _STLP_USE_GLIBC + #endif + +diff -urN STLport-4.5.3/stlport/cstdlib STLport-4.5.3-devel/stlport/cstdlib +--- STLport-4.5.3/stlport/cstdlib Thu Aug 23 15:51:54 2001 ++++ STLport-4.5.3-devel/stlport/cstdlib Tue Jan 7 15:28:08 2003 +@@ -55,9 +55,11 @@ + using _STLP_VENDOR_CSTD::atof; + using _STLP_VENDOR_CSTD::atoi; + using _STLP_VENDOR_CSTD::atol; ++# ifndef _STLP_USE_UCLIBC + using _STLP_VENDOR_CSTD::mblen; + using _STLP_VENDOR_CSTD::mbstowcs; + using _STLP_VENDOR_CSTD::mbtowc; ++# endif + using _STLP_VENDOR_CSTD::strtod; + using _STLP_VENDOR_CSTD::strtol; + using _STLP_VENDOR_CSTD::strtoul; +diff -urN STLport-4.5.3/stlport/stl/_config.h STLport-4.5.3-devel/stlport/stl/_config.h +--- STLport-4.5.3/stlport/stl/_config.h Fri Jan 18 15:08:36 2002 ++++ STLport-4.5.3-devel/stlport/stl/_config.h Tue Jan 7 15:28:08 2003 +@@ -26,6 +26,16 @@ + #ifndef _STLP_CONFIG_H + # define _STLP_CONFIG_H + ++/* Make the STLport headers provide uClibc support by default */ ++#define _STLP_NO_EXCEPTIONS 1 ++#define STL_NO_EXCEPTIONS 1 ++#define _STLP_USE_UCLIBC 1 ++//#define _STLP_NO_WCHAR_T 1 ++#define _STLP_NO_LONG_DOUBLE 1 ++#define USE_SPRINTF_INSTEAD 1 ++#define _ISOC99_SOURCE 1 ++#define _STLP_NO_ANACHRONISMS 1 ++ + /* + * Purpose of this file : + * +@@ -164,7 +174,7 @@ + /* Operating system recognition (basic) */ + # if defined (__unix) || defined (__linux__) || defined (__QNX__) || defined (_AIX) || defined (__NetBSD__) || defined (__Lynx__) + # define _STLP_UNIX 1 +-# if defined (__linux__) && ! defined (_STLP_USE_GLIBC) ++# if defined (__linux__) && ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC) + # define _STLP_USE_GLIBC 1 + # endif + # elif defined(macintosh) || defined (_MAC) +diff -urN STLport-4.5.3/stlport/stl/_stdio_file.h STLport-4.5.3-devel/stlport/stl/_stdio_file.h +--- STLport-4.5.3/stlport/stl/_stdio_file.h Fri Jan 18 15:07:00 2002 ++++ STLport-4.5.3-devel/stlport/stl/_stdio_file.h Tue Jan 7 15:28:08 2003 +@@ -634,6 +634,112 @@ + } + # define _STLP_FILE_I_O_IDENTICAL + ++#elif defined(_STLP_USE_UCLIBC) ++ ++#if defined(__MASK_READING) ++ ++inline int _FILE_fd(const FILE *__f) { return __f->__filedes; } ++ ++// Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__bufstart; } ++ ++// Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__bufpos; } ++ ++// Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->__bufend; } ++ ++// Returns the number of characters remaining in the buffer, i.e. ++// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f) ++ { return __f->__bufgetc_u - __f->__bufpos; } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_preincr(FILE *__f) { return *(char*)(++__f->__bufpos); } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postincr(FILE *__f) { return *(char*)(__f->__bufpos++); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_predecr(FILE *__f) { return *(char*)(--__f->__bufpos); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f) { return *(char*)(__f->__bufpos--); } ++ ++// Increments the current read/write position by __n. ++inline void _FILE_I_bump(FILE *__f, int __n) { __f->__bufpos += __n; } ++ ++// Sets the beginning of the bufer to __begin, the current read/write ++// position to __next, and the buffer's past-the-end pointer to __end. ++// If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++ __f->__bufstart = (unsigned char*)__begin; ++ __f->__bufpos = (unsigned char*)__next; ++ __f->__bufend = (unsigned char*)__end; ++ __f->__bufgetc_u = (unsigned char*)__begin; ++ __f->__bufputc_u = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#else // Support old stdio for a little while. ++ ++inline int _FILE_fd(const FILE *__f) { return __f->filedes; } ++ ++// Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->bufstart; } ++ ++// Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->bufpos; } ++ ++// Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->bufend; } ++ ++// Returns the number of characters remaining in the buffer, i.e. ++// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f) ++ { return __f->bufgetc - __f->bufpos; } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_preincr(FILE *__f) { return *(char*)(++__f->bufpos); } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postincr(FILE *__f) { return *(char*)(__f->bufpos++); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_predecr(FILE *__f) { return *(char*)(--__f->bufpos); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f) { return *(char*)(__f->bufpos--); } ++ ++// Increments the current read/write position by __n. ++inline void _FILE_I_bump(FILE *__f, int __n) { __f->bufpos += __n; } ++ ++// Sets the beginning of the bufer to __begin, the current read/write ++// position to __next, and the buffer's past-the-end pointer to __end. ++// If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++ __f->bufstart = (unsigned char*)__begin; ++ __f->bufpos = (unsigned char*)__next; ++ __f->bufend = (unsigned char*)__end; ++ __f->bufgetc = (unsigned char*)__begin; ++ __f->bufputc = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#endif ++ + #else /* A C library that we don't have an implementation for. */ + + # error The C++ I/O library is not configured for this compiler +diff -urN STLport-4.5.3/stlport/stl/c_locale.h STLport-4.5.3-devel/stlport/stl/c_locale.h +--- STLport-4.5.3/stlport/stl/c_locale.h Fri Jan 18 15:07:00 2002 ++++ STLport-4.5.3-devel/stlport/stl/c_locale.h Wed Jan 8 10:58:10 2003 +@@ -401,6 +401,21 @@ + # define _Locale_SPACE _S + # define _Locale_PRINT (_P | _U | _L | _N | _B) + # define _Locale_ALPHA (_U | _L) ++ ++# elif defined(_STLP_USE_UCLIBC) /* linux, using the gnu compiler */ ++ ++# define _Locale_CNTRL _IScntrl ++# define _Locale_UPPER _ISupper ++# define _Locale_LOWER _ISlower ++# define _Locale_DIGIT _ISdigit ++# define _Locale_XDIGIT _ISxdigit ++# define _Locale_PUNCT _ISpunct ++# define _Locale_SPACE _ISspace ++# define _Locale_PRINT _ISprint ++# define _Locale_ALPHA _ISalpha ++ ++#else ++# error Unknown Locale + #endif + + # endif /* _STLP_C_LOCALE_H */ diff --git a/obsolete-buildroot/sources/binutils-uclibc-001-debian.patch b/obsolete-buildroot/sources/binutils-uclibc-001-debian.patch new file mode 100644 index 0000000000..1dd39a933d --- /dev/null +++ b/obsolete-buildroot/sources/binutils-uclibc-001-debian.patch @@ -0,0 +1,2394 @@ +diff -urN binutils-2.14.90.0.7.orig/bfd/ChangeLog binutils-2.14.90.0.7/bfd/ChangeLog +--- binutils-2.14.90.0.7.orig/bfd/ChangeLog 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/ChangeLog 2004-04-20 01:26:12.000000000 -0600 +@@ -1,3 +1,34 @@ ++2003-10-29 Daniel Jacobowitz ++ ++ * elf32-arm.h (elf32_arm_final_link_relocate): Move check for ++ SEC_ALLOC. ++ ++2003-10-29 Philip Blundell ++ ++ * elf32-arm.h (elf32_arm_plt0_entry, elf32_arm_plt_entry): New ++ code sequence. ++ (PLT_HEADER_SIZE): New. ++ (struct elf32_arm_pcrel_relocs_copied): Rename to ... ++ (struct elf32_arm_relocs_copied): ... this. Count both ++ pcrel and non-pcrel relocs. All uses updated. ++ (struct elf32_arm_link_hash_table): Add pointers to dynamic linker ++ sections and symbol/section mapping cache. ++ (create_got_section): New. ++ (elf32_arm_create_dynamic_sections): New. ++ (elf_backend_create_dynamic_sections): Use it. ++ (elf32_arm_final_link_relocate): Support garbage collection of relocs. ++ (elf32_arm_check_relocs): Likewise. ++ (elf32_arm_adjust_dynamic_symbol): Likewise. ++ (elf32_arm_copy_indirect_symbol): New. ++ (elf32_arm_link_hash_table_create): Initialise new fields. ++ (elf32_arm_gc_sweep_hook): Implement. ++ (elf32_arm_discard_copies): Delete. ++ (elf32_arm_finish_dynamic_symbol): Use new PLT code. ++ (elf32_arm_finish_dynamic_sections): Likewise. ++ (elf_backend_can_refcount): Define. ++ (elf_backend_copy_indirect_symbol): Likewise. ++ (elf_backend_plt_header_size): Set to PLT_HEADER_SIZE. ++ + 2003-10-29 Alan Modra + + * elf64-ppc.c (elf_backend_grok_prstatus): Define. +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-bfd.h binutils-2.14.90.0.7/bfd/elf-bfd.h +--- binutils-2.14.90.0.7.orig/bfd/elf-bfd.h 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf-bfd.h 2004-04-20 01:26:12.000000000 -0600 +@@ -1303,7 +1303,7 @@ + extern enum elf_reloc_type_class _bfd_elf_reloc_type_class + (const Elf_Internal_Rela *); + extern bfd_vma _bfd_elf_rela_local_sym +- (bfd *, Elf_Internal_Sym *, asection *, Elf_Internal_Rela *); ++ (bfd *, Elf_Internal_Sym *, asection **, Elf_Internal_Rela *); + extern bfd_vma _bfd_elf_rel_local_sym + (bfd *, Elf_Internal_Sym *, asection **, bfd_vma); + extern bfd_vma _bfd_elf_section_offset +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-hppa.h binutils-2.14.90.0.7/bfd/elf-hppa.h +--- binutils-2.14.90.0.7.orig/bfd/elf-hppa.h 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-hppa.h 2004-04-20 01:26:12.000000000 -0600 +@@ -1346,11 +1346,11 @@ + /* This is a local symbol. */ + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel); + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1373,7 +1373,7 @@ + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1410,7 +1410,7 @@ + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1426,7 +1426,7 @@ + } + else if (h->root.type == bfd_link_hash_undefweak) + { +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-m10200.c binutils-2.14.90.0.7/bfd/elf-m10200.c +--- binutils-2.14.90.0.7.orig/bfd/elf-m10200.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-m10200.c 2004-04-20 01:26:12.000000000 -0600 +@@ -373,7 +373,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-m10300.c binutils-2.14.90.0.7/bfd/elf-m10300.c +--- binutils-2.14.90.0.7.orig/bfd/elf-m10300.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-m10300.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1574,7 +1574,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf.c binutils-2.14.90.0.7/bfd/elf.c +--- binutils-2.14.90.0.7.orig/bfd/elf.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf.c 2004-04-20 01:26:12.000000000 -0600 +@@ -7367,9 +7367,10 @@ + bfd_vma + _bfd_elf_rela_local_sym (bfd *abfd, + Elf_Internal_Sym *sym, +- asection *sec, ++ asection **psec, + Elf_Internal_Rela *rel) + { ++ asection *sec = *psec; + bfd_vma relocation; + + relocation = (sec->output_section->vma +@@ -7379,16 +7380,14 @@ + && ELF_ST_TYPE (sym->st_info) == STT_SECTION + && sec->sec_info_type == ELF_INFO_TYPE_MERGE) + { +- asection *msec; +- +- msec = sec; + rel->r_addend = +- _bfd_merged_section_offset (abfd, &msec, ++ _bfd_merged_section_offset (abfd, psec, + elf_section_data (sec)->sec_info, + sym->st_value + rel->r_addend, +- 0) +- - relocation; +- rel->r_addend += msec->output_section->vma + msec->output_offset; ++ 0); ++ sec = *psec; ++ rel->r_addend -= relocation; ++ rel->r_addend += sec->output_section->vma + sec->output_offset; + } + return relocation; + } +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-arm.h binutils-2.14.90.0.7/bfd/elf32-arm.h +--- binutils-2.14.90.0.7.orig/bfd/elf32-arm.h 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-arm.h 2004-04-20 01:26:12.000000000 -0600 +@@ -84,6 +84,12 @@ + static void arm_add_to_rel + PARAMS ((bfd *, bfd_byte *, reloc_howto_type *, bfd_signed_vma)); + #endif ++static bfd_boolean allocate_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean create_got_section ++ PARAMS ((bfd * dynobj, struct bfd_link_info * info)); ++static bfd_boolean elf32_arm_create_dynamic_sections ++ PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static enum elf_reloc_type_class elf32_arm_reloc_type_class + PARAMS ((const Elf_Internal_Rela *)); + static bfd_boolean elf32_arm_object_p +@@ -119,6 +125,12 @@ + section. */ + #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" + ++#ifdef FOUR_WORD_PLT ++ ++/* The size in bytes of the special first entry in the procedure ++ linkage table. */ ++#define PLT_HEADER_SIZE 16 ++ + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 16 + +@@ -126,23 +138,56 @@ + this. It is set up so that any shared library function that is + called before the relocation has been set up calls the dynamic + linker first. */ +-static const bfd_vma elf32_arm_plt0_entry [PLT_ENTRY_SIZE / 4] = ++static const bfd_vma elf32_arm_plt0_entry [PLT_HEADER_SIZE / 4] = + { +- 0xe52de004, /* str lr, [sp, #-4]! */ +- 0xe59fe010, /* ldr lr, [pc, #16] */ +- 0xe08fe00e, /* add lr, pc, lr */ +- 0xe5bef008 /* ldr pc, [lr, #8]! */ ++ 0xe52de004, /* str lr, [sp, #-4]! */ ++ 0xe59fe010, /* ldr lr, [pc, #16] */ ++ 0xe08fe00e, /* add lr, pc, lr */ ++ 0xe5bef008, /* ldr pc, [lr, #8]! */ + }; + + /* Subsequent entries in a procedure linkage table look like + this. */ + static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] = +- { +- 0xe59fc004, /* ldr ip, [pc, #4] */ +- 0xe08fc00c, /* add ip, pc, ip */ +- 0xe59cf000, /* ldr pc, [ip] */ +- 0x00000000 /* offset to symbol in got */ +- }; ++ { ++ 0xe28fc600, /* add ip, pc, #NN */ ++ 0xe28cca00, /* add ip, ip, #NN */ ++ 0xe5bcf000, /* ldr pc, [ip, #NN]! */ ++ 0x00000000, /* unused */ ++ }; ++ ++#else ++ ++/* The size in bytes of the special first entry in the procedure ++ linkage table. */ ++#define PLT_HEADER_SIZE 20 ++ ++/* The size in bytes of an entry in the procedure linkage table. */ ++#define PLT_ENTRY_SIZE 12 ++ ++/* The first entry in a procedure linkage table looks like ++ this. It is set up so that any shared library function that is ++ called before the relocation has been set up calls the dynamic ++ linker first. */ ++static const bfd_vma elf32_arm_plt0_entry [PLT_HEADER_SIZE / 4] = ++ { ++ 0xe52de004, /* str lr, [sp, #-4]! */ ++ 0xe59fe004, /* ldr lr, [pc, #4] */ ++ 0xe08fe00e, /* add lr, pc, lr */ ++ 0xe5bef008, /* ldr pc, [lr, #8]! */ ++ 0x00000000, /* &GOT[0] - . */ ++ }; ++ ++/* Subsequent entries in a procedure linkage table look like ++ this. */ ++static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] = ++ { ++ 0xe28fc600, /* add ip, pc, #0xNN00000 */ ++ 0xe28cca00, /* add ip, ip, #0xNN000 */ ++ 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */ ++ }; ++ ++#endif + + /* The ARM linker needs to keep track of the number of relocs that it + decides to copy in check_relocs for each symbol. This is so that +@@ -152,14 +197,16 @@ + + /* This structure keeps track of the number of PC relative relocs we + have copied for a given symbol. */ +-struct elf32_arm_pcrel_relocs_copied ++struct elf32_arm_relocs_copied + { + /* Next section. */ +- struct elf32_arm_pcrel_relocs_copied * next; ++ struct elf32_arm_relocs_copied * next; + /* A section in dynobj. */ + asection * section; + /* Number of relocs copied in this section. */ + bfd_size_type count; ++ /* Number of relocs copied in this section. */ ++ bfd_size_type pc_count; + }; + + /* Arm ELF linker hash entry. */ +@@ -168,13 +215,9 @@ + struct elf_link_hash_entry root; + + /* Number of PC relative relocs copied for this symbol. */ +- struct elf32_arm_pcrel_relocs_copied * pcrel_relocs_copied; ++ struct elf32_arm_relocs_copied * relocs_copied; + }; + +-/* Declare this now that the above structures are defined. */ +-static bfd_boolean elf32_arm_discard_copies +- PARAMS ((struct elf32_arm_link_hash_entry *, PTR)); +- + /* Traverse an arm ELF linker hash table. */ + #define elf32_arm_link_hash_traverse(table, func, info) \ + (elf_link_hash_traverse \ +@@ -204,6 +247,18 @@ + /* A boolean indicating whether knowledge of the ARM's pipeline + length should be applied by the linker. */ + int no_pipeline_knowledge; ++ ++ /* Short-cuts to get to dynamic linker sections. */ ++ asection *sgot; ++ asection *sgotplt; ++ asection *srelgot; ++ asection *splt; ++ asection *srelplt; ++ asection *sdynbss; ++ asection *srelbss; ++ ++ /* Small local sym to section mapping cache. */ ++ struct sym_sec_cache sym_sec; + }; + + /* Create an entry in an ARM ELF linker hash table. */ +@@ -231,11 +286,121 @@ + _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, + table, string)); + if (ret != (struct elf32_arm_link_hash_entry *) NULL) +- ret->pcrel_relocs_copied = NULL; ++ ret->relocs_copied = NULL; + + return (struct bfd_hash_entry *) ret; + } + ++/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up ++ shortcuts to them in our hash table. */ ++ ++static bfd_boolean ++create_got_section (dynobj, info) ++ bfd *dynobj; ++ struct bfd_link_info *info; ++{ ++ struct elf32_arm_link_hash_table *htab; ++ ++ if (! _bfd_elf_create_got_section (dynobj, info)) ++ return FALSE; ++ ++ htab = elf32_arm_hash_table (info); ++ htab->sgot = bfd_get_section_by_name (dynobj, ".got"); ++ htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); ++ if (!htab->sgot || !htab->sgotplt) ++ abort (); ++ ++ htab->srelgot = bfd_make_section (dynobj, ".rel.got"); ++ if (htab->srelgot == NULL ++ || ! bfd_set_section_flags (dynobj, htab->srelgot, ++ (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS ++ | SEC_IN_MEMORY | SEC_LINKER_CREATED ++ | SEC_READONLY)) ++ || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2)) ++ return FALSE; ++ return TRUE; ++} ++ ++/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and ++ .rel.bss sections in DYNOBJ, and set up shortcuts to them in our ++ hash table. */ ++ ++static bfd_boolean ++elf32_arm_create_dynamic_sections (dynobj, info) ++ bfd *dynobj; ++ struct bfd_link_info *info; ++{ ++ struct elf32_arm_link_hash_table *htab; ++ ++ htab = elf32_arm_hash_table (info); ++ if (!htab->sgot && !create_got_section (dynobj, info)) ++ return FALSE; ++ ++ if (!_bfd_elf_create_dynamic_sections (dynobj, info)) ++ return FALSE; ++ ++ htab->splt = bfd_get_section_by_name (dynobj, ".plt"); ++ htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt"); ++ htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); ++ if (!info->shared) ++ htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss"); ++ ++ if (!htab->splt || !htab->srelplt || !htab->sdynbss ++ || (!info->shared && !htab->srelbss)) ++ abort (); ++ ++ return TRUE; ++} ++ ++/* Copy the extra info we tack onto an elf_link_hash_entry. */ ++ ++static void ++elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed, ++ struct elf_link_hash_entry *dir, ++ struct elf_link_hash_entry *ind) ++{ ++ struct elf32_arm_link_hash_entry *edir, *eind; ++ ++ edir = (struct elf32_arm_link_hash_entry *) dir; ++ eind = (struct elf32_arm_link_hash_entry *) ind; ++ ++ if (eind->relocs_copied != NULL) ++ { ++ if (edir->relocs_copied != NULL) ++ { ++ struct elf32_arm_relocs_copied **pp; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (ind->root.type == bfd_link_hash_indirect) ++ abort (); ++ ++ /* Add reloc counts against the weak sym to the strong sym ++ list. Merge any entries against the same section. */ ++ for (pp = &eind->relocs_copied; (p = *pp) != NULL; ) ++ { ++ struct elf32_arm_relocs_copied *q; ++ ++ for (q = edir->relocs_copied; q != NULL; q = q->next) ++ if (q->section == p->section) ++ { ++ q->pc_count += p->pc_count; ++ q->count += p->count; ++ *pp = p->next; ++ break; ++ } ++ if (q == NULL) ++ pp = &p->next; ++ } ++ *pp = edir->relocs_copied; ++ } ++ ++ edir->relocs_copied = eind->relocs_copied; ++ eind->relocs_copied = NULL; ++ } ++ ++ _bfd_elf_link_hash_copy_indirect (bed, dir, ind); ++} ++ + /* Create an ARM elf linker hash table. */ + + static struct bfd_link_hash_table * +@@ -256,10 +421,18 @@ + return NULL; + } + ++ ret->sgot = NULL; ++ ret->sgotplt = NULL; ++ ret->srelgot = NULL; ++ ret->splt = NULL; ++ ret->srelplt = NULL; ++ ret->sdynbss = NULL; ++ ret->srelbss = NULL; + ret->thumb_glue_size = 0; + ret->arm_glue_size = 0; + ret->bfd_of_glue_owner = NULL; + ret->no_pipeline_knowledge = 0; ++ ret->sym_sec.abfd = NULL; + + return &ret->root.root; + } +@@ -1134,16 +1307,21 @@ + #ifndef OLD_ARM_ABI + case R_ARM_XPC25: + #endif ++ /* r_symndx will be zero only for relocs against symbols ++ from removed linkonce sections, or sections discarded by ++ a linker script. */ ++ if (r_symndx == 0) ++ return bfd_reloc_ok; ++ + /* When generating a shared object, these relocations are copied + into the output file to be resolved at run time. */ +- if (info->shared +- && r_symndx != 0 +- && (r_type != R_ARM_PC24 +- || (h != NULL +- && h->dynindx != -1 +- && (! info->symbolic +- || (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) == 0)))) ++ if ((info->shared ++ && (input_section->flags & SEC_ALLOC) ++ && (h == NULL ++ || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak) ++ && (r_type != R_ARM_PC24 ++ || !SYMBOL_CALLS_LOCAL (info, h)))) + { + Elf_Internal_Rela outrel; + bfd_byte *loc; +@@ -1184,30 +1362,19 @@ + + if (skip) + memset (&outrel, 0, sizeof outrel); +- else if (r_type == R_ARM_PC24) +- { +- BFD_ASSERT (h != NULL && h->dynindx != -1); +- if ((input_section->flags & SEC_ALLOC) == 0) +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_PC24); +- } ++ else if (h != NULL ++ && h->dynindx != -1 ++ && (r_type == R_ARM_PC24 ++ || !info->shared ++ || !info->symbolic ++ || (h->elf_link_hash_flags ++ & ELF_LINK_HASH_DEF_REGULAR) == 0)) ++ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); + else + { +- if (h == NULL +- || ((info->symbolic || h->dynindx == -1) +- && (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) != 0)) +- { +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); +- } +- else +- { +- BFD_ASSERT (h->dynindx != -1); +- if ((input_section->flags & SEC_ALLOC) == 0) +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_ABS32); +- } ++ /* This symbol is local, or marked to become local. */ ++ relocate = TRUE; ++ outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); + } + + loc = sreloc->contents; +@@ -1617,16 +1784,17 @@ + if (h != NULL) + { + bfd_vma off; +- bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created; ++ bfd_boolean dyn; + + off = h->got.offset; + BFD_ASSERT (off != (bfd_vma) -1); ++ dyn = globals->root.dynamic_sections_created; + +- if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) ++ if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) + || (info->shared +- && (info->symbolic || h->dynindx == -1 +- || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) ++ && SYMBOL_REFERENCES_LOCAL (info, h)) ++ || (ELF_ST_VISIBILITY (h->other) ++ && h->root.type == bfd_link_hash_undefweak)) + { + /* This is actually a static link, or it is a -Bsymbolic link + and the symbol is defined locally. We must initialize this +@@ -1712,7 +1880,8 @@ + contents, rel->r_offset, value, + (bfd_vma) 0); + +- if (h->plt.offset == (bfd_vma) -1) ++ if (h->plt.offset == (bfd_vma) -1 ++ || globals->splt == NULL) + /* We didn't make a PLT entry for this symbol. This + happens when statically linking PIC code, or when + using -Bsymbolic. */ +@@ -1958,7 +2127,7 @@ + bfd_put_32 (input_bfd, value, contents + rel->r_offset); + } + #else +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + #endif + } + else +@@ -1983,9 +2152,10 @@ + case R_ARM_THM_PC22: + if (info->shared + && ( +- (!info->symbolic && h->dynindx != -1) ++ (!info->symbolic && h->dynindx != -1) + || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 + ) ++ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && ((input_section->flags & SEC_ALLOC) != 0 + /* DWARF will emit R_ARM_ABS32 relocations in its + sections against symbols defined externally +@@ -2603,7 +2773,82 @@ + asection *sec ATTRIBUTE_UNUSED; + const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; + { +- /* We don't support garbage collection of GOT and PLT relocs yet. */ ++ Elf_Internal_Shdr *symtab_hdr; ++ struct elf_link_hash_entry **sym_hashes; ++ bfd_signed_vma *local_got_refcounts; ++ const Elf_Internal_Rela *rel, *relend; ++ unsigned long r_symndx; ++ struct elf_link_hash_entry *h; ++ ++ elf_section_data (sec)->local_dynrel = NULL; ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ sym_hashes = elf_sym_hashes (abfd); ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ ++ relend = relocs + sec->reloc_count; ++ for (rel = relocs; rel < relend; rel++) ++ switch (ELF32_R_TYPE (rel->r_info)) ++ { ++ case R_ARM_GOT32: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if (h->got.refcount > 0) ++ h->got.refcount -= 1; ++ } ++ else if (local_got_refcounts != NULL) ++ { ++ if (local_got_refcounts[r_symndx] > 0) ++ local_got_refcounts[r_symndx] -= 1; ++ } ++ break; ++ ++ case R_ARM_ABS32: ++ case R_ARM_REL32: ++ case R_ARM_PC24: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied **pp; ++ struct elf32_arm_relocs_copied *p; ++ ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ ++ if (!info->shared && h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ ++ for (pp = &eh->relocs_copied; (p = *pp) != NULL; pp = &p->next) ++ if (p->section == sec) ++ { ++ if (ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ p->pc_count -= 1; ++ p->count -= 1; ++ if (p->count == 0) ++ *pp = p->next; ++ break; ++ } ++ } ++ break; ++ ++ case R_ARM_PLT32: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if (h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ + return TRUE; + } + +@@ -2622,13 +2867,15 @@ + const Elf_Internal_Rela *rel; + const Elf_Internal_Rela *rel_end; + bfd *dynobj; +- asection *sgot, *srelgot, *sreloc; ++ asection *sreloc; + bfd_vma *local_got_offsets; ++ struct elf32_arm_link_hash_table *htab; + + if (info->relocatable) + return TRUE; + +- sgot = srelgot = sreloc = NULL; ++ htab = elf32_arm_hash_table (info); ++ sreloc = NULL; + + dynobj = elf_hash_table (info)->dynobj; + local_got_offsets = elf_local_got_offsets (abfd); +@@ -2653,126 +2900,82 @@ + else + h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + +- /* Some relocs require a global offset table. */ +- if (dynobj == NULL) +- { +- switch (ELF32_R_TYPE (rel->r_info)) +- { +- case R_ARM_GOT32: +- case R_ARM_GOTOFF: +- case R_ARM_GOTPC: +- elf_hash_table (info)->dynobj = dynobj = abfd; +- if (! _bfd_elf_create_got_section (dynobj, info)) +- return FALSE; +- break; +- +- default: +- break; +- } +- } +- + switch (ELF32_R_TYPE (rel->r_info)) + { +- case R_ARM_GOT32: +- /* This symbol requires a global offset table entry. */ +- if (sgot == NULL) +- { +- sgot = bfd_get_section_by_name (dynobj, ".got"); +- BFD_ASSERT (sgot != NULL); +- } ++ case R_ARM_PLT32: ++ /* This symbol requires a procedure linkage table entry. We ++ actually build the entry in adjust_dynamic_symbol, ++ because this might be a case of linking PIC code which is ++ never referenced by a dynamic object, in which case we ++ don't need to generate a procedure linkage table entry ++ after all. */ + +- /* Get the got relocation section if necessary. */ +- if (srelgot == NULL +- && (h != NULL || info->shared)) +- { +- srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); ++ /* If this is a local symbol, we resolve it directly without ++ creating a procedure linkage table entry. */ ++ if (h == NULL) ++ continue; + +- /* If no got relocation section, make one and initialize. */ +- if (srelgot == NULL) +- { +- srelgot = bfd_make_section (dynobj, ".rel.got"); +- if (srelgot == NULL +- || ! bfd_set_section_flags (dynobj, srelgot, +- (SEC_ALLOC +- | SEC_LOAD +- | SEC_HAS_CONTENTS +- | SEC_IN_MEMORY +- | SEC_LINKER_CREATED +- | SEC_READONLY)) +- || ! bfd_set_section_alignment (dynobj, srelgot, 2)) +- return FALSE; +- } +- } ++ h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; ++ h->plt.refcount++; ++ break; + ++ case R_ARM_GOT32: ++ /* This symbol requires a global offset table entry. */ + if (h != NULL) + { +- if (h->got.offset != (bfd_vma) -1) +- /* We have already allocated space in the .got. */ +- break; +- +- h->got.offset = sgot->_raw_size; +- +- /* Make sure this symbol is output as a dynamic symbol. */ +- if (h->dynindx == -1) +- if (! bfd_elf32_link_record_dynamic_symbol (info, h)) +- return FALSE; +- +- srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ h->got.refcount++; + } + else + { +- /* This is a global offset table entry for a local +- symbol. */ +- if (local_got_offsets == NULL) ++ bfd_signed_vma *local_got_refcounts; ++ ++ /* This is a global offset table entry for a local symbol. */ ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ if (local_got_refcounts == NULL) + { + bfd_size_type size; +- unsigned int i; + + size = symtab_hdr->sh_info; +- size *= sizeof (bfd_vma); +- local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); +- if (local_got_offsets == NULL) ++ size *= (sizeof (bfd_signed_vma) + sizeof(char)); ++ local_got_refcounts = ((bfd_signed_vma *) ++ bfd_zalloc (abfd, size)); ++ if (local_got_refcounts == NULL) + return FALSE; +- elf_local_got_offsets (abfd) = local_got_offsets; +- for (i = 0; i < symtab_hdr->sh_info; i++) +- local_got_offsets[i] = (bfd_vma) -1; ++ elf_local_got_refcounts (abfd) = local_got_refcounts; + } +- +- if (local_got_offsets[r_symndx] != (bfd_vma) -1) +- /* We have already allocated space in the .got. */ +- break; +- +- local_got_offsets[r_symndx] = sgot->_raw_size; +- +- if (info->shared) +- /* If we are generating a shared object, we need to +- output a R_ARM_RELATIVE reloc so that the dynamic +- linker can adjust this GOT entry. */ +- srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ local_got_refcounts[r_symndx] += 1; + } +- +- sgot->_raw_size += 4; + break; + +- case R_ARM_PLT32: +- /* This symbol requires a procedure linkage table entry. We +- actually build the entry in adjust_dynamic_symbol, +- because this might be a case of linking PIC code which is +- never referenced by a dynamic object, in which case we +- don't need to generate a procedure linkage table entry +- after all. */ +- +- /* If this is a local symbol, we resolve it directly without +- creating a procedure linkage table entry. */ +- if (h == NULL) +- continue; +- +- h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; ++ case R_ARM_GOTOFF: ++ case R_ARM_GOTPC: ++ if (htab->sgot == NULL) ++ { ++ if (htab->root.dynobj == NULL) ++ htab->root.dynobj = abfd; ++ if (!create_got_section (htab->root.dynobj, info)) ++ return FALSE; ++ } + break; + + case R_ARM_ABS32: + case R_ARM_REL32: + case R_ARM_PC24: ++ if (h != NULL && !info->shared) ++ { ++ /* If this reloc is in a read-only section, we might ++ need a copy reloc. We can't check reliably at this ++ stage whether the section is read-only, as input ++ sections have not yet been mapped to output sections. ++ Tentatively set the flag for now, and correct in ++ adjust_dynamic_symbol. */ ++ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; ++ ++ /* We may need a .plt entry if the function this reloc ++ refers to is in a shared lib. */ ++ h->plt.refcount += 1; ++ } ++ + /* If we are creating a shared library, and this is a reloc + against a global symbol, or a non PC relative reloc + against a local symbol, then we need to copy the reloc +@@ -2784,14 +2987,17 @@ + possible that DEF_REGULAR is not set now but will be set + later (it is never cleared). We account for that + possibility below by storing information in the +- pcrel_relocs_copied field of the hash table entry. */ ++ relocs_copied field of the hash table entry. */ + if (info->shared +- && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24 +- || (h != NULL +- && (! info->symbolic +- || (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) == 0)))) ++ && (sec->flags & SEC_ALLOC) != 0 ++ && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24 ++ || (h != NULL ++ && (! info->symbolic ++ || (h->elf_link_hash_flags ++ & ELF_LINK_HASH_DEF_REGULAR) == 0)))) + { ++ struct elf32_arm_relocs_copied *p, **head; ++ + /* When creating a shared object, we must copy these + reloc types into the output file. We create a reloc + section in dynobj and make room for this reloc. */ +@@ -2825,45 +3031,49 @@ + || ! bfd_set_section_alignment (dynobj, sreloc, 2)) + return FALSE; + } +- if (sec->flags & SEC_READONLY) +- info->flags |= DF_TEXTREL; ++ ++ elf_section_data (sec)->sreloc = sreloc; + } + +- sreloc->_raw_size += sizeof (Elf32_External_Rel); +- /* If we are linking with -Bsymbolic, and this is a +- global symbol, we count the number of PC relative +- relocations we have entered for this symbol, so that +- we can discard them again if the symbol is later +- defined by a regular object. Note that this function +- is only called if we are using an elf_i386 linker +- hash table, which means that h is really a pointer to +- an elf_i386_link_hash_entry. */ +- if (h != NULL && info->symbolic +- && ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ /* If this is a global symbol, we count the number of ++ relocations we need for this symbol. */ ++ if (h != NULL) + { +- struct elf32_arm_link_hash_entry * eh; +- struct elf32_arm_pcrel_relocs_copied * p; +- +- eh = (struct elf32_arm_link_hash_entry *) h; +- +- for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next) +- if (p->section == sreloc) +- break; +- ++ head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied; ++ } ++ else ++ { ++ /* Track dynamic relocs needed for local syms too. ++ We really need local syms available to do this ++ easily. Oh well. */ ++ ++ asection *s; ++ s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, ++ sec, r_symndx); ++ if (s == NULL) ++ return FALSE; ++ ++ head = ((struct elf32_arm_relocs_copied **) ++ &elf_section_data (s)->local_dynrel); ++ } ++ ++ p = *head; ++ if (p == NULL || p->section != sec) ++ { ++ bfd_size_type amt = sizeof *p; ++ p = bfd_alloc (htab->root.dynobj, amt); + if (p == NULL) +- { +- p = ((struct elf32_arm_pcrel_relocs_copied *) +- bfd_alloc (dynobj, (bfd_size_type) sizeof * p)); +- if (p == NULL) +- return FALSE; +- p->next = eh->pcrel_relocs_copied; +- eh->pcrel_relocs_copied = p; +- p->section = sreloc; +- p->count = 0; +- } +- +- ++p->count; ++ return FALSE; ++ p->next = *head; ++ *head = p; ++ p->section = sec; ++ p->count = 0; ++ p->pc_count = 0; + } ++ ++ p->count += 1; ++ if (ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ p->pc_count += 1; + } + break; + +@@ -3003,71 +3213,29 @@ + if (h->type == STT_FUNC + || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) + { +- /* If we link a program (not a DSO), we'll get rid of unnecessary +- PLT entries; we point to the actual symbols -- even for pic +- relocs, because a program built with -fpic should have the same +- result as one built without -fpic, specifically considering weak +- symbols. +- FIXME: m68k and i386 differ here, for unclear reasons. */ +- if (! info->shared +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0) ++ if (h->plt.refcount <= 0 ++ || SYMBOL_CALLS_LOCAL (info, h) ++ || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ && h->root.type == bfd_link_hash_undefweak)) + { + /* This case can occur if we saw a PLT32 reloc in an input +- file, but the symbol was not defined by a dynamic object. +- In such a case, we don't actually need to build a +- procedure linkage table, and we can just do a PC32 reloc +- instead. */ +- BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0); ++ file, but the symbol was never referred to by a dynamic ++ object, or if all references were garbage collected. In ++ such a case, we don't actually need to build a procedure ++ linkage table, and we can just do a PC24 reloc instead. */ ++ h->plt.offset = (bfd_vma) -1; + h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; +- return TRUE; +- } +- +- /* Make sure this symbol is output as a dynamic symbol. */ +- if (h->dynindx == -1) +- { +- if (! bfd_elf32_link_record_dynamic_symbol (info, h)) +- return FALSE; + } + +- s = bfd_get_section_by_name (dynobj, ".plt"); +- BFD_ASSERT (s != NULL); +- +- /* If this is the first .plt entry, make room for the special +- first entry. */ +- if (s->_raw_size == 0) +- s->_raw_size += PLT_ENTRY_SIZE; +- +- /* If this symbol is not defined in a regular file, and we are +- not generating a shared library, then set the symbol to this +- location in the .plt. This is required to make function +- pointers compare as equal between the normal executable and +- the shared library. */ +- if (! info->shared +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) +- { +- h->root.u.def.section = s; +- h->root.u.def.value = s->_raw_size; +- } +- +- h->plt.offset = s->_raw_size; +- +- /* Make room for this entry. */ +- s->_raw_size += PLT_ENTRY_SIZE; +- +- /* We also need to make an entry in the .got.plt section, which +- will be placed in the .got section by the linker script. */ +- s = bfd_get_section_by_name (dynobj, ".got.plt"); +- BFD_ASSERT (s != NULL); +- s->_raw_size += 4; +- +- /* We also need to make an entry in the .rel.plt section. */ +- +- s = bfd_get_section_by_name (dynobj, ".rel.plt"); +- BFD_ASSERT (s != NULL); +- s->_raw_size += sizeof (Elf32_External_Rel); +- + return TRUE; + } ++ else ++ /* It's possible that we incorrectly decided a .plt reloc was ++ needed for an R_ARM_PC24 reloc to a non-function sym in ++ check_relocs. We can't decide accurately between function and ++ non-function syms in check-relocs; Objects loaded later in ++ the link may change h->type. So fix it now. */ ++ h->plt.offset = (bfd_vma) -1; + + /* If this is a weak symbol, and there is a real definition, the + processor independent code will have arranged for us to see the +@@ -3142,6 +3310,198 @@ + return TRUE; + } + ++/* Allocate space in .plt, .got and associated reloc sections for ++ dynamic relocs. */ ++ ++static bfd_boolean ++allocate_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct bfd_link_info *info; ++ struct elf32_arm_link_hash_table *htab; ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_indirect) ++ return TRUE; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ /* When warning symbols are created, they **replace** the "real" ++ entry in the hash table, thus we never get to see the real ++ symbol in a hash traversal. So look at it now. */ ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ info = (struct bfd_link_info *) inf; ++ htab = elf32_arm_hash_table (info); ++ ++ if (htab->root.dynamic_sections_created ++ && h->plt.refcount > 0) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ if (info->shared ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) ++ { ++ asection *s = htab->splt; ++ ++ /* If this is the first .plt entry, make room for the special ++ first entry. */ ++ if (s->_raw_size == 0) ++ s->_raw_size += PLT_HEADER_SIZE; ++ ++ h->plt.offset = s->_raw_size; ++ ++ /* If this symbol is not defined in a regular file, and we are ++ not generating a shared library, then set the symbol to this ++ location in the .plt. This is required to make function ++ pointers compare as equal between the normal executable and ++ the shared library. */ ++ if (! info->shared ++ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) ++ { ++ h->root.u.def.section = s; ++ h->root.u.def.value = h->plt.offset; ++ } ++ ++ /* Make room for this entry. */ ++ s->_raw_size += PLT_ENTRY_SIZE; ++ ++ /* We also need to make an entry in the .got.plt section, which ++ will be placed in the .got section by the linker script. */ ++ htab->sgotplt->_raw_size += 4; ++ ++ /* We also need to make an entry in the .rel.plt section. */ ++ htab->srelplt->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) -1; ++ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; ++ } ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) -1; ++ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; ++ } ++ ++ if (h->got.refcount > 0) ++ { ++ asection *s; ++ bfd_boolean dyn; ++ ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ s = htab->sgot; ++ h->got.offset = s->_raw_size; ++ s->_raw_size += 4; ++ dyn = htab->root.dynamic_sections_created; ++ if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak) ++ && (info->shared ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) ++ htab->srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ h->got.offset = (bfd_vma) -1; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ if (eh->relocs_copied == NULL) ++ return TRUE; ++ ++ /* In the shared -Bsymbolic case, discard space allocated for ++ dynamic pc-relative relocs against symbols which turn out to be ++ defined in regular objects. For the normal shared case, discard ++ space for pc-relative relocs that have become local due to symbol ++ visibility changes. */ ++ ++ if (info->shared) ++ { ++ /* The only reloc that uses pc_count is R_ARM_PC24, which will ++ appear on a call or on something like ".long foo - .". We ++ want calls to protected symbols to resolve directly to the ++ function rather than going via the plt. If people want ++ function pointer comparisons to work as expected then they ++ should avoid writing assembly like ".long foo - .". */ ++ if (SYMBOL_CALLS_LOCAL (info, h)) ++ { ++ struct elf32_arm_relocs_copied **pp; ++ ++ for (pp = &eh->relocs_copied; (p = *pp) != NULL; ) ++ { ++ p->count -= p->pc_count; ++ p->pc_count = 0; ++ if (p->count == 0) ++ *pp = p->next; ++ else ++ pp = &p->next; ++ } ++ } ++ ++ /* Also discard relocs on undefined weak syms with non-default ++ visibility. */ ++ if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ && h->root.type == bfd_link_hash_undefweak) ++ eh->relocs_copied = NULL; ++ } ++ else ++ { ++ /* For the non-shared case, discard space for relocs against ++ symbols which turn out to need copy relocs or are not ++ dynamic. */ ++ ++ if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 ++ && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 ++ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) ++ || (htab->root.dynamic_sections_created ++ && (h->root.type == bfd_link_hash_undefweak ++ || h->root.type == bfd_link_hash_undefined)))) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ /* If that succeeded, we know we'll be keeping all the ++ relocs. */ ++ if (h->dynindx != -1) ++ goto keep; ++ } ++ ++ eh->relocs_copied = NULL; ++ ++ keep: ; ++ } ++ ++ /* Finally, allocate space. */ ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *sreloc = elf_section_data (p->section)->sreloc; ++ sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel); ++ } ++ ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3153,7 +3513,10 @@ + asection * s; + bfd_boolean plt; + bfd_boolean relocs; ++ bfd *ibfd; ++ struct elf32_arm_link_hash_table *htab; + ++ htab = elf32_arm_hash_table (info); + dynobj = elf_hash_table (info)->dynobj; + BFD_ASSERT (dynobj != NULL); + +@@ -3168,26 +3531,74 @@ + s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; + } + } +- else +- { +- /* We may have created entries in the .rel.got section. +- However, if we are not creating the dynamic sections, we will +- not actually use these entries. Reset the size of .rel.got, +- which will cause it to get stripped from the output file +- below. */ +- s = bfd_get_section_by_name (dynobj, ".rel.got"); +- if (s != NULL) +- s->_raw_size = 0; +- } +- +- /* If this is a -Bsymbolic shared link, then we need to discard all +- PC relative relocs against symbols defined in a regular object. +- We allocated space for them in the check_relocs routine, but we +- will not fill them in in the relocate_section routine. */ +- if (info->shared && info->symbolic) +- elf32_arm_link_hash_traverse (elf32_arm_hash_table (info), +- elf32_arm_discard_copies, +- (PTR) NULL); ++ ++ /* Set up .got offsets for local syms, and space for local dynamic ++ relocs. */ ++ for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) ++ { ++ bfd_signed_vma *local_got; ++ bfd_signed_vma *end_local_got; ++ char *local_tls_type; ++ bfd_size_type locsymcount; ++ Elf_Internal_Shdr *symtab_hdr; ++ asection *srel; ++ ++ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) ++ continue; ++ ++ for (s = ibfd->sections; s != NULL; s = s->next) ++ { ++ struct elf32_arm_relocs_copied *p; ++ ++ for (p = *((struct elf32_arm_relocs_copied **) ++ &elf_section_data (s)->local_dynrel); ++ p != NULL; ++ p = p->next) ++ { ++ if (!bfd_is_abs_section (p->section) ++ && bfd_is_abs_section (p->section->output_section)) ++ { ++ /* Input section has been discarded, either because ++ it is a copy of a linkonce section or due to ++ linker script /DISCARD/, so we'll be discarding ++ the relocs too. */ ++ } ++ else if (p->count != 0) ++ { ++ srel = elf_section_data (p->section)->sreloc; ++ srel->_raw_size += p->count * sizeof (Elf32_External_Rel); ++ if ((p->section->output_section->flags & SEC_READONLY) != 0) ++ info->flags |= DF_TEXTREL; ++ } ++ } ++ } ++ ++ local_got = elf_local_got_refcounts (ibfd); ++ if (!local_got) ++ continue; ++ ++ symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; ++ locsymcount = symtab_hdr->sh_info; ++ end_local_got = local_got + locsymcount; ++ s = htab->sgot; ++ srel = htab->srelgot; ++ for (; local_got < end_local_got; ++local_got, ++local_tls_type) ++ { ++ if (*local_got > 0) ++ { ++ *local_got = s->_raw_size; ++ s->_raw_size += 4; ++ if (info->shared) ++ srel->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ *local_got = (bfd_vma) -1; ++ } ++ } ++ ++ /* Allocate global sym .plt and .got entries, and space for global ++ sym dynamic relocs. */ ++ elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info); + + /* The check_relocs and adjust_dynamic_symbol entry points have + determined the sizes of the various dynamic sections. Allocate +@@ -3312,33 +3723,6 @@ + return TRUE; + } + +-/* This function is called via elf32_arm_link_hash_traverse if we are +- creating a shared object with -Bsymbolic. It discards the space +- allocated to copy PC relative relocs against symbols which are +- defined in regular objects. We allocated space for them in the +- check_relocs routine, but we won't fill them in in the +- relocate_section routine. */ +- +-static bfd_boolean +-elf32_arm_discard_copies (h, ignore) +- struct elf32_arm_link_hash_entry * h; +- PTR ignore ATTRIBUTE_UNUSED; +-{ +- struct elf32_arm_pcrel_relocs_copied * s; +- +- if (h->root.root.type == bfd_link_hash_warning) +- h = (struct elf32_arm_link_hash_entry *) h->root.root.u.i.link; +- +- /* We only discard relocs for symbols defined in a regular object. */ +- if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) +- return TRUE; +- +- for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) +- s->section->_raw_size -= s->count * sizeof (Elf32_External_Rel); +- +- return TRUE; +-} +- + /* Finish up dynamic symbol handling. We set the contents of various + dynamic sections here. */ + +@@ -3362,6 +3746,7 @@ + bfd_vma got_offset; + Elf_Internal_Rela rel; + bfd_byte *loc; ++ bfd_vma got_displacement; + + /* This symbol has an entry in the procedure linkage table. Set + it up. */ +@@ -3377,35 +3762,43 @@ + corresponds to this symbol. This is the index of this symbol + in all the symbols for which we are making plt entries. The + first entry in the procedure linkage table is reserved. */ +- plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; ++ plt_index = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE; + + /* Get the offset into the .got table of the entry that + corresponds to this function. Each .got entry is 4 bytes. + The first three are reserved. */ + got_offset = (plt_index + 3) * 4; + ++ /* Calculate the displacement between the PLT slot and the ++ entry in the GOT. */ ++ got_displacement = (sgot->output_section->vma ++ + sgot->output_offset ++ + got_offset ++ - splt->output_section->vma ++ - splt->output_offset ++ - h->plt.offset ++ - 8); ++ ++ BFD_ASSERT ((got_displacement & 0xf0000000) == 0); ++ + /* Fill in the entry in the procedure linkage table. */ +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[0], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20), + splt->contents + h->plt.offset + 0); +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[1], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12), + splt->contents + h->plt.offset + 4); +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[2], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff), + splt->contents + h->plt.offset + 8); +- bfd_put_32 (output_bfd, +- (sgot->output_section->vma +- + sgot->output_offset +- + got_offset +- - splt->output_section->vma +- - splt->output_offset +- - h->plt.offset - 12), +- splt->contents + h->plt.offset + 12); ++#ifdef FOUR_WORD_PLT ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ++ splt->contents + h->plt.offset + 12); ++#endif + + /* Fill in the entry in the global offset table. */ + bfd_put_32 (output_bfd, + (splt->output_section->vma + + splt->output_offset), + sgot->contents + got_offset); +- ++ + /* Fill in the entry in the .rel.plt section. */ + rel.r_offset = (sgot->output_section->vma + + sgot->output_offset +@@ -3446,16 +3839,20 @@ + + sgot->output_offset + + (h->got.offset &~ (bfd_vma) 1)); + +- /* If this is a -Bsymbolic link, and the symbol is defined +- locally, we just want to emit a RELATIVE reloc. The entry in +- the global offset table will already have been initialized in +- the relocate_section function. */ ++ /* If this is a static link, or it is a -Bsymbolic link and the ++ symbol is defined locally or was forced to be local because ++ of a version file, we just want to emit a RELATIVE reloc. ++ The entry in the global offset table will already have been ++ initialized in the relocate_section function. */ + if (info->shared +- && (info->symbolic || h->dynindx == -1) +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) +- rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); ++ && SYMBOL_REFERENCES_LOCAL (info, h)) ++ { ++ BFD_ASSERT((h->got.offset & 1) != 0); ++ rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); ++ } + else + { ++ BFD_ASSERT((h->got.offset & 1) == 0); + bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); + rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT); + } +@@ -3609,10 +4006,26 @@ + /* Fill in the first entry in the procedure linkage table. */ + if (splt->_raw_size > 0) + { ++ bfd_vma got_displacement; ++ ++ /* Calculate the displacement between the PLT slot and &GOT[0]. */ ++ got_displacement = (sgot->output_section->vma ++ + sgot->output_offset ++ - splt->output_section->vma ++ - splt->output_offset ++ - 16); ++ + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents + 0); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents + 4); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents + 8); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12); ++#ifdef FOUR_WORD_PLT ++ /* The displacement value goes in the otherwise-unused last word of ++ the second entry. */ ++ bfd_put_32 (output_bfd, got_displacement, splt->contents + 28); ++#else ++ bfd_put_32 (output_bfd, got_displacement, splt->contents + 16); ++#endif + } + + /* UnixWare sets the entsize of .plt to 4, although that doesn't +@@ -3714,7 +4127,7 @@ + #define elf_backend_check_relocs elf32_arm_check_relocs + #define elf_backend_relocate_section elf32_arm_relocate_section + #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol +-#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections ++#define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections + #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol + #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections + #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections +@@ -3723,7 +4136,9 @@ + #define elf_backend_object_p elf32_arm_object_p + #define elf_backend_section_flags elf32_arm_section_flags + #define elf_backend_final_write_processing elf32_arm_final_write_processing ++#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol + ++#define elf_backend_can_refcount 1 + #define elf_backend_can_gc_sections 1 + #define elf_backend_plt_readonly 1 + #define elf_backend_want_got_plt 1 +@@ -3733,7 +4148,7 @@ + #endif + + #define elf_backend_got_header_size 12 +-#define elf_backend_plt_header_size PLT_ENTRY_SIZE ++#define elf_backend_plt_header_size PLT_HEADER_SIZE + + #include "elf32-target.h" + +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-avr.c binutils-2.14.90.0.7/bfd/elf32-avr.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-avr.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-avr.c 2004-04-20 01:26:12.000000000 -0600 +@@ -750,7 +750,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-cris.c binutils-2.14.90.0.7/bfd/elf32-cris.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-cris.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-cris.c 2004-04-20 01:26:12.000000000 -0600 +@@ -847,7 +847,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + symname = (bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name)); +@@ -1292,16 +1292,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-fr30.c binutils-2.14.90.0.7/bfd/elf32-fr30.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-fr30.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-fr30.c 2004-04-20 01:26:12.000000000 -0600 +@@ -552,7 +552,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-frv.c binutils-2.14.90.0.7/bfd/elf32-frv.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-frv.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-frv.c 2004-04-20 01:26:12.000000000 -0600 +@@ -724,7 +724,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-h8300.c binutils-2.14.90.0.7/bfd/elf32-h8300.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-h8300.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-h8300.c 2004-04-20 01:26:12.000000000 -0600 +@@ -435,7 +435,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-hppa.c binutils-2.14.90.0.7/bfd/elf32-hppa.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-hppa.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-hppa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -3408,7 +3408,7 @@ + /* This is a local symbol, h defaults to NULL. */ + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-i370.c binutils-2.14.90.0.7/bfd/elf32-i370.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-i370.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-i370.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1210,7 +1210,7 @@ + sec = local_sections[r_symndx]; + sym_name = ""; + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else +@@ -1363,16 +1363,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-i860.c binutils-2.14.90.0.7/bfd/elf32-i860.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-i860.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-i860.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1104,7 +1104,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-m32r.c binutils-2.14.90.0.7/bfd/elf32-m32r.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-m32r.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-m32r.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1107,7 +1107,7 @@ + sec = local_sections[r_symndx]; + sym_name = ""; + #if !USE_REL +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + #else + /* FIXME: This won't handle local relocations against SEC_MERGE +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-m68k.c binutils-2.14.90.0.7/bfd/elf32-m68k.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-m68k.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-m68k.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1403,7 +1403,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -1657,16 +1657,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-mcore.c binutils-2.14.90.0.7/bfd/elf32-mcore.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-mcore.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-mcore.c 2004-04-20 01:26:12.000000000 -0600 +@@ -467,7 +467,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-msp430.c binutils-2.14.90.0.7/bfd/elf32-msp430.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-msp430.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-msp430.c 2004-04-20 01:26:12.000000000 -0600 +@@ -449,7 +449,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-openrisc.c binutils-2.14.90.0.7/bfd/elf32-openrisc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-openrisc.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-openrisc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -375,7 +375,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-ppc.c binutils-2.14.90.0.7/bfd/elf32-ppc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-ppc.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-ppc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4727,7 +4727,7 @@ + sec = local_sections[r_symndx]; + sym_name = bfd_elf_local_sym_name (input_bfd, sym); + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -5455,44 +5455,9 @@ + break; + + case R_PPC_RELAX32: +- { +- unsigned long r_symndx; +- Elf_Internal_Sym *sym; +- asection *sym_sec; +- bfd_byte *hit_addr = 0; +- bfd_vma value = 0; +- +- r_symndx = ELF32_R_SYM (rel->r_info); +- +- if (r_symndx < symtab_hdr->sh_info) +- { +- sym = local_syms + r_symndx; +- sym_sec = local_sections[r_symndx]; +- +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); +- } +- else +- { +- bfd_boolean warned; +- bfd_boolean unresolved_reloc; +- +- RELOC_FOR_GLOBAL_SYMBOL (h, elf_sym_hashes (input_bfd), +- r_symndx, symtab_hdr, +- value, sym_sec, +- unresolved_reloc, info, +- warned); +- if (warned) +- continue; +- } +- hit_addr = contents + rel->r_offset; +- value += rel->r_addend; +- +- r = ppc_elf_install_value (output_bfd, hit_addr, value, r_type); +- if (r != bfd_reloc_ok) +- break; +- else +- continue; +- } ++ ppc_elf_install_value (output_bfd, contents + rel->r_offset, ++ relocation + addend, r_type); ++ continue; + + /* Indirect .sdata relocation. */ + case R_PPC_EMB_SDAI16: +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-s390.c binutils-2.14.90.0.7/bfd/elf32-s390.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-s390.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-s390.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2327,7 +2327,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-sh.c binutils-2.14.90.0.7/bfd/elf32-sh.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-sh.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-sh.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4805,7 +4805,7 @@ + } + else if (! howto->partial_inplace) + { +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else if ((sec->flags & SEC_MERGE) +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-sparc.c binutils-2.14.90.0.7/bfd/elf32-sparc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-sparc.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-sparc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2182,7 +2182,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2459,16 +2459,8 @@ + + if (is_plt) + sec = htab->splt; +- else if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-v850.c binutils-2.14.90.0.7/bfd/elf32-v850.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-v850.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-v850.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1681,7 +1681,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + #if 0 + { + char * name; +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-vax.c binutils-2.14.90.0.7/bfd/elf32-vax.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-vax.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-vax.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1483,7 +1483,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -1737,16 +1737,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-xstormy16.c binutils-2.14.90.0.7/bfd/elf32-xstormy16.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-xstormy16.c 2003-07-23 09:08:09.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-xstormy16.c 2004-04-20 01:26:12.000000000 -0600 +@@ -845,7 +845,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-xtensa.c binutils-2.14.90.0.7/bfd/elf32-xtensa.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-xtensa.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-xtensa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2004,7 +2004,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-alpha.c binutils-2.14.90.0.7/bfd/elf64-alpha.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-alpha.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-alpha.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4394,9 +4394,11 @@ + + if (r_symndx < symtab_hdr->sh_info) + { ++ asection *msec; + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ msec = sec; ++ value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); + + /* If this is a tp-relative relocation against sym 0, + this is hackery from relax_section. Force the value to +@@ -4424,7 +4426,6 @@ + && !gotent->reloc_xlated) + { + struct alpha_elf_got_entry *ent; +- asection *msec; + + for (ent = gotent; ent; ent = ent->next) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-hppa.c binutils-2.14.90.0.7/bfd/elf64-hppa.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-hppa.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-hppa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -173,7 +173,7 @@ + PTR info)); + + static const char *get_dyn_name +- PARAMS ((asection *, struct elf_link_hash_entry *, ++ PARAMS ((bfd *, struct elf_link_hash_entry *, + const Elf_Internal_Rela *, char **, size_t *)); + + /* This must follow the definitions of the various derived linker +@@ -446,13 +446,14 @@ + allocate memory as necessary, possibly reusing PBUF/PLEN. */ + + static const char * +-get_dyn_name (sec, h, rel, pbuf, plen) +- asection *sec; ++get_dyn_name (abfd, h, rel, pbuf, plen) ++ bfd *abfd; + struct elf_link_hash_entry *h; + const Elf_Internal_Rela *rel; + char **pbuf; + size_t *plen; + { ++ asection *sec = abfd->sections; + size_t nlen, tlen; + char *buf; + size_t len; +@@ -858,7 +859,7 @@ + continue; + + /* Collect a canonical name for this address. */ +- addr_name = get_dyn_name (sec, h, rel, &buf, &buf_len); ++ addr_name = get_dyn_name (abfd, h, rel, &buf, &buf_len); + + /* Collect the canonical entry data for this address. */ + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-mmix.c binutils-2.14.90.0.7/bfd/elf64-mmix.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-mmix.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-mmix.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1472,7 +1472,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-ppc.c binutils-2.14.90.0.7/bfd/elf64-ppc.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-ppc.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-ppc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -7385,7 +7385,7 @@ + sec = local_sections[r_symndx]; + sym_name = bfd_elf_local_sym_name (input_bfd, sym); + sym_type = ELF64_ST_TYPE (sym->st_info); +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + if (elf_section_data (sec) != NULL) + { + long *opd_sym_adjust; +@@ -8178,7 +8178,9 @@ + relocation = TOCstart; + if (r_symndx == 0) + relocation += htab->stub_group[input_section->id].toc_off; +- else if (sec != NULL && !unresolved_reloc) ++ else if (unresolved_reloc) ++ ; ++ else if (sec != NULL && sec->id <= htab->top_id) + relocation += htab->stub_group[sec->id].toc_off; + else + unresolved_reloc = TRUE; +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-s390.c binutils-2.14.90.0.7/bfd/elf64-s390.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-s390.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-s390.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2297,7 +2297,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-sh64.c binutils-2.14.90.0.7/bfd/elf64-sh64.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-sh64.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-sh64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1582,7 +1582,7 @@ + } + else if (! howto->partial_inplace) + { +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + relocation |= ((sym->st_other & STO_SH5_ISA32) != 0); + } + else if ((sec->flags & SEC_MERGE) +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-sparc.c binutils-2.14.90.0.7/bfd/elf64-sparc.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-sparc.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-sparc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2070,7 +2070,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2247,16 +2247,8 @@ + + if (is_plt) + sec = splt; +- else if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-x86-64.c binutils-2.14.90.0.7/bfd/elf64-x86-64.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-x86-64.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-x86-64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1823,7 +1823,7 @@ + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2048,16 +2048,7 @@ + { + long sindx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + sindx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elfxx-ia64.c binutils-2.14.90.0.7/bfd/elfxx-ia64.c +--- binutils-2.14.90.0.7.orig/bfd/elfxx-ia64.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elfxx-ia64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -3849,9 +3849,11 @@ + if (r_symndx < symtab_hdr->sh_info) + { + /* Reloc against local symbol. */ ++ asection *msec; + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ msec = sym_sec; ++ value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); + if ((sym_sec->flags & SEC_MERGE) + && ELF_ST_TYPE (sym->st_info) == STT_SECTION + && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE) +@@ -3862,7 +3864,6 @@ + if (loc_h && ! loc_h->sec_merge_done) + { + struct elfNN_ia64_dyn_sym_info *dynent; +- asection *msec; + + for (dynent = loc_h->info; dynent; dynent = dynent->next) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/opncls.c binutils-2.14.90.0.7/bfd/opncls.c +--- binutils-2.14.90.0.7.orig/bfd/opncls.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/opncls.c 2004-04-20 01:26:11.000000000 -0600 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.14.90.0.7.orig/binutils/objcopy.c binutils-2.14.90.0.7/binutils/objcopy.c +--- binutils-2.14.90.0.7.orig/binutils/objcopy.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/binutils/objcopy.c 2004-04-20 01:26:12.000000000 -0600 +@@ -27,6 +27,7 @@ + #include "libiberty.h" + #include "budbg.h" + #include "filenames.h" ++#include "elf-bfd.h" + #include + + /* A list of symbols to explicitly strip out, or to keep. A linked +@@ -385,6 +386,7 @@ + -g --strip-debug Remove all debugging symbols & sections\n\ + --strip-unneeded Remove all symbols not needed by relocations\n\ + -N --strip-symbol Do not copy symbol \n\ ++ --only-keep-debug Strip everything but the debug information\n\ + -K --keep-symbol Only copy symbol \n\ + -L --localize-symbol Force symbol to be marked as a local\n\ + -G --keep-global-symbol Localize all symbols except \n\ +@@ -457,6 +459,7 @@ + -s --strip-all Remove all symbol and relocation information\n\ + -g -S -d --strip-debug Remove all debugging symbols & sections\n\ + --strip-unneeded Remove all symbols not needed by relocations\n\ ++ --only-keep-debug Strip everything but the debug information\n\ + -N --strip-symbol= Do not copy symbol \n\ + -K --keep-symbol= Only copy symbol \n\ + -x --discard-all Remove all non-global symbols\n\ +@@ -734,7 +737,7 @@ + return FALSE; + } + +- return strip_symbols == STRIP_NONDEBUG ? TRUE : FALSE; ++ return FALSE; + } + + /* Choose which symbol entries to copy; put the result in OSYMS. +@@ -1806,6 +1809,13 @@ + + if (p != NULL && p->set_flags) + flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC)); ++ else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0) ++ { ++ flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD); ++ if (obfd->xvec->flavour == bfd_target_elf_flavour) ++ elf_section_type (osection) = SHT_NOBITS; ++ } ++ + if (!bfd_set_section_flags (obfd, osection, flags)) + { + err = _("flags"); +@@ -1926,6 +1936,8 @@ + } + + bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount); ++ if (relcount == 0) ++ free (relpp); + } + + isection->_cooked_size = isection->_raw_size; +diff -urN binutils-2.14.90.0.7.orig/binutils/readelf.c binutils-2.14.90.0.7/binutils/readelf.c +--- binutils-2.14.90.0.7.orig/binutils/readelf.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/binutils/readelf.c 2004-04-20 01:26:12.000000000 -0600 +@@ -6055,7 +6055,7 @@ + + bytes = section->sh_size; + +- if (bytes == 0) ++ if (bytes == 0 || section->sh_type == SHT_NOBITS) + { + printf (_("\nSection '%s' has no data to dump.\n"), + SECTION_NAME (section)); +diff -urN binutils-2.14.90.0.7.orig/gprof/gprof.texi binutils-2.14.90.0.7/gprof/gprof.texi +--- binutils-2.14.90.0.7.orig/gprof/gprof.texi 2002-08-01 18:49:32.000000000 -0600 ++++ binutils-2.14.90.0.7/gprof/gprof.texi 2004-04-20 01:26:11.000000000 -0600 +@@ -137,6 +137,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -181,7 +185,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +@@ -267,6 +271,11 @@ + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: + ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. ++ + @example + cc -g -c myprog.c utils.c -pg + cc -o myprog myprog.o utils.o -pg +diff -urN binutils-2.14.90.0.7.orig/ld/Makefile.am binutils-2.14.90.0.7/ld/Makefile.am +--- binutils-2.14.90.0.7.orig/ld/Makefile.am 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/Makefile.am 2004-04-20 01:26:11.000000000 -0600 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.7.orig/ld/Makefile.in binutils-2.14.90.0.7/ld/Makefile.in +--- binutils-2.14.90.0.7.orig/ld/Makefile.in 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/Makefile.in 2004-04-20 01:26:11.000000000 -0600 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.7.orig/ld/emultempl/elf32.em binutils-2.14.90.0.7/ld/emultempl/elf32.em +--- binutils-2.14.90.0.7.orig/ld/emultempl/elf32.em 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/ld/emultempl/elf32.em 2004-04-20 01:26:11.000000000 -0600 +@@ -679,6 +679,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -855,6 +857,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.14.90.0.7.orig/ltmain.sh binutils-2.14.90.0.7/ltmain.sh +--- binutils-2.14.90.0.7.orig/ltmain.sh 2002-03-22 15:06:16.000000000 -0700 ++++ binutils-2.14.90.0.7/ltmain.sh 2004-04-20 01:26:12.000000000 -0600 +@@ -4413,6 +4413,10 @@ + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +diff -urN binutils-2.14.90.0.7.orig/opcodes/Makefile.am binutils-2.14.90.0.7/opcodes/Makefile.am +--- binutils-2.14.90.0.7.orig/opcodes/Makefile.am 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/Makefile.am 2004-04-20 01:26:12.000000000 -0600 +@@ -284,7 +284,7 @@ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in +diff -urN binutils-2.14.90.0.7.orig/opcodes/Makefile.in binutils-2.14.90.0.7/opcodes/Makefile.in +--- binutils-2.14.90.0.7.orig/opcodes/Makefile.in 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/Makefile.in 2004-04-20 01:26:12.000000000 -0600 +@@ -394,7 +394,7 @@ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in +@@ -593,7 +593,7 @@ + all-recursive install-data-recursive install-exec-recursive \ + installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ + check-recursive installcheck-recursive info-recursive dvi-recursive: +- @set fnord $(MAKEFLAGS); amf=$$2; \ ++ @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -613,7 +613,7 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $(MAKEFLAGS); amf=$$2; \ ++ @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ +diff -urN binutils-2.14.90.0.7.orig/opcodes/alpha-opc.c binutils-2.14.90.0.7/opcodes/alpha-opc.c +--- binutils-2.14.90.0.7.orig/opcodes/alpha-opc.c 2003-01-21 11:21:34.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/alpha-opc.c 2004-04-20 01:26:11.000000000 -0600 +@@ -1105,7 +1105,8 @@ + { "wmb", MFC(0x18,0x4400), BASE, ARG_NONE }, + { "fetch", MFC(0x18,0x8000), BASE, { ZA, PRB } }, + { "fetch_m", MFC(0x18,0xA000), BASE, { ZA, PRB } }, +- { "rpcc", MFC(0x18,0xC000), BASE, { RA } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, ZB } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, RB } }, /* ev6 una */ + { "rc", MFC(0x18,0xE000), BASE, { RA } }, + { "ecb", MFC(0x18,0xE800), BASE, { ZA, PRB } }, /* ev56 una */ + { "rs", MFC(0x18,0xF000), BASE, { RA } }, +diff -urN binutils-2.14.90.0.7.orig/opcodes/m68k-opc.c binutils-2.14.90.0.7/opcodes/m68k-opc.c +--- binutils-2.14.90.0.7.orig/opcodes/m68k-opc.c 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/m68k-opc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -847,15 +847,15 @@ + {"fmoved", two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat }, + {"fmovel", two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat }, + {"fmovel", two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7$l", mfloat }, ++/* FIXME: the next two variants should not permit moving an address ++ register to anything but the floating point instruction register. */ ++{"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat }, ++{"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat }, + {"fmovel", two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat }, + {"fmovel", two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat }, + /* Move the FP control registers */ + {"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8ps", cfloat }, + {"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Iibss8", cfloat }, +-/* FIXME: the next two variants should not permit moving an address +- register to anything but the floating point instruction register. */ +-{"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat }, +-{"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat }, + {"fmovep", two(0xF000, 0x4C00), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat }, + {"fmovep", two(0xF000, 0x6C00), two(0xF1C0, 0xFC00), "IiF7~pkC", mfloat }, + {"fmovep", two(0xF000, 0x7C00), two(0xF1C0, 0xFC0F), "IiF7~pDk", mfloat }, diff --git a/obsolete-buildroot/sources/binutils-uclibc-100-conf.patch b/obsolete-buildroot/sources/binutils-uclibc-100-conf.patch new file mode 100644 index 0000000000..6e36af2298 --- /dev/null +++ b/obsolete-buildroot/sources/binutils-uclibc-100-conf.patch @@ -0,0 +1,646 @@ +diff -urN binutils-2.14.90.0.7.orig/bfd/config.bfd binutils-2.14.90.0.7/bfd/config.bfd +--- binutils-2.14.90.0.7.orig/bfd/config.bfd 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/config.bfd 2004-04-20 01:37:12.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-linux-uclibc* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -214,7 +214,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -222,7 +222,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux* | arm*-*-linux-uclibc* | arm-*-kfreebsd*-gnu) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -355,7 +355,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -366,7 +366,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -488,7 +488,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -502,7 +502,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -662,7 +662,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -929,7 +929,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -961,8 +962,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1110,7 +1111,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1157,7 +1158,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.7.orig/bfd/configure binutils-2.14.90.0.7/bfd/configure +--- binutils-2.14.90.0.7.orig/bfd/configure 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.7.orig/bfd/configure.in binutils-2.14.90.0.7/bfd/configure.in +--- binutils-2.14.90.0.7.orig/bfd/configure.in 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/configure.in 2004-04-20 01:32:29.000000000 -0600 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.7.orig/config.sub binutils-2.14.90.0.7/config.sub +--- binutils-2.14.90.0.7.orig/config.sub 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/config.sub 2004-04-20 01:32:29.000000000 -0600 +@@ -118,7 +118,7 @@ + # 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* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.7.orig/configure binutils-2.14.90.0.7/configure +--- binutils-2.14.90.0.7.orig/configure 2003-10-29 10:38:23.000000000 -0700 ++++ binutils-2.14.90.0.7/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1276,6 +1276,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.7.orig/configure.in binutils-2.14.90.0.7/configure.in +--- binutils-2.14.90.0.7.orig/configure.in 2003-10-29 10:38:20.000000000 -0700 ++++ binutils-2.14.90.0.7/configure.in 2004-04-20 01:32:29.000000000 -0600 +@@ -515,6 +515,19 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ build_modules= ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.7.orig/demangler/configure binutils-2.14.90.0.7/demangler/configure +--- binutils-2.14.90.0.7.orig/demangler/configure 2003-10-29 10:38:20.000000000 -0700 ++++ binutils-2.14.90.0.7/demangler/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1380,6 +1380,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.7.orig/gas/configure binutils-2.14.90.0.7/gas/configure +--- binutils-2.14.90.0.7.orig/gas/configure 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/gas/configure 2004-04-20 01:37:58.000000000 -0600 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4028,6 +4033,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4044,6 +4050,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4058,6 +4065,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4114,7 +4122,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4201,6 +4212,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -4257,7 +4269,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; +- ppc-*-linux-gnu*) fmt=elf em=linux ++ ppc-*-linux-uclibc* | ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; + *) { { echo "$as_me:$LINENO: error: GNU/Linux must be configured big endian" >&5 +@@ -4286,7 +4298,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4319,6 +4333,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.7.orig/gas/configure.in binutils-2.14.90.0.7/gas/configure.in +--- binutils-2.14.90.0.7.orig/gas/configure.in 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/gas/configure.in 2004-04-20 01:38:23.000000000 -0600 +@@ -192,6 +192,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -208,6 +209,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -222,6 +224,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -278,7 +281,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -358,6 +364,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -412,7 +419,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; +- ppc-*-linux-gnu*) fmt=elf em=linux ++ ppc-*-linux-uclibc* | ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; + *) AC_MSG_ERROR(GNU/Linux must be configured big endian) ;; +@@ -434,7 +441,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -467,6 +476,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.7.orig/ld/configure binutils-2.14.90.0.7/ld/configure +--- binutils-2.14.90.0.7.orig/ld/configure 2003-05-05 15:46:49.000000000 -0600 ++++ binutils-2.14.90.0.7/ld/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.7.orig/ld/configure.tgt binutils-2.14.90.0.7/ld/configure.tgt +--- binutils-2.14.90.0.7.orig/ld/configure.tgt 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/configure.tgt 2004-04-20 01:32:29.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -125,7 +128,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -149,14 +152,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -256,10 +261,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -360,7 +368,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -376,9 +385,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -422,16 +431,20 @@ + mips*-*-rtems*) targ_emul=elf32ebmip ;; + mips*el-*-vxworks*) targ_emul=elf32elmip ;; + mips*-*-vxworks*) targ_emul=elf32ebmip ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -454,6 +467,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.7.orig/libtool.m4 binutils-2.14.90.0.7/libtool.m4 +--- binutils-2.14.90.0.7.orig/libtool.m4 2003-05-05 15:46:46.000000000 -0600 ++++ binutils-2.14.90.0.7/libtool.m4 2004-04-20 01:32:29.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.7.orig/ltconfig binutils-2.14.90.0.7/ltconfig +--- binutils-2.14.90.0.7.orig/ltconfig 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/ltconfig 2004-04-20 01:32:29.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/obsolete-buildroot/sources/binutils-uclibc-200-build_modules.patch b/obsolete-buildroot/sources/binutils-uclibc-200-build_modules.patch new file mode 100644 index 0000000000..e9f8e75a89 --- /dev/null +++ b/obsolete-buildroot/sources/binutils-uclibc-200-build_modules.patch @@ -0,0 +1,31 @@ +Get around an odd build failure. +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -906,6 +906,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -178,6 +178,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" diff --git a/obsolete-buildroot/sources/binutils-uclibc-210-cflags.patch b/obsolete-buildroot/sources/binutils-uclibc-210-cflags.patch new file mode 100644 index 0000000000..dc67d3c4e3 --- /dev/null +++ b/obsolete-buildroot/sources/binutils-uclibc-210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/obsolete-buildroot/sources/boa-config.site-i386 b/obsolete-buildroot/sources/boa-config.site-i386 new file mode 100644 index 0000000000..425d948c41 --- /dev/null +++ b/obsolete-buildroot/sources/boa-config.site-i386 @@ -0,0 +1 @@ +ac_cv_func_setvbuf_reversed=no diff --git a/obsolete-buildroot/sources/boa.conf b/obsolete-buildroot/sources/boa.conf new file mode 100644 index 0000000000..91653e5505 --- /dev/null +++ b/obsolete-buildroot/sources/boa.conf @@ -0,0 +1,187 @@ +# Boa v0.94 configuration file +# File format has not changed from 0.93 +# File format has changed little from 0.92 +# version changes are noted in the comments +# +# The Boa configuration file is parsed with a lex/yacc or flex/bison +# generated parser. If it reports an error, the line number will be +# provided; it should be easy to spot. The syntax of each of these +# rules is very simple, and they can occur in any order. Where possible +# these directives mimic those of NCSA httpd 1.3; I saw no reason to +# introduce gratuitous differences. + +# $Id$ + +# The "ServerRoot" is not in this configuration file. It can be compiled +# into the server (see defines.h) or specified on the command line with +# the -c option, for example: +# +# boa -c /usr/local/boa + + +# Port: The port Boa runs on. The default port for http servers is 80. +# If it is less than 1024, the server must be started as root. + +Port 80 + +# Listen: the Internet address to bind(2) to. If you leave it out, +# it takes the behavior before 0.93.17.2, which is to bind to all +# addresses (INADDR_ANY). You only get one "Listen" directive, +# if you want service on multiple IP addresses, you have three choices: +# 1. Run boa without a "Listen" directive +# a. All addresses are treated the same; makes sense if the addresses +# are localhost, ppp, and eth0. +# b. Use the VirtualHost directive below to point requests to different +# files. Should be good for a very large number of addresses (web +# hosting clients). +# 2. Run one copy of boa per IP address, each has its own configuration +# with a "Listen" directive. No big deal up to a few tens of addresses. +# Nice separation between clients. +# The name you provide gets run through inet_aton(3), so you have to use dotted +# quad notation. This configuration is too important to trust some DNS. + +#Listen 192.68.0.5 + +# User: The name or UID the server should run as. +# Group: The group name or GID the server should run as. + +User nobody +Group nobody + +# ServerAdmin: The email address where server problems should be sent. +# Note: this is not currently used, except as an environment variable +# for CGIs. + +#ServerAdmin root@localhost + +# ErrorLog: The location of the error log file. If this does not start +# with /, it is considered relative to the server root. +# Set to /dev/null if you don't want errors logged. +# If unset, defaults to /dev/stderr + +ErrorLog /var/log/boa/error_log +# Please NOTE: Sending the logs to a pipe ('|'), as shown below, +# is somewhat experimental and might fail under heavy load. +# "Usual libc implementations of printf will stall the whole +# process if the receiving end of a pipe stops reading." +#ErrorLog "|/usr/sbin/cronolog --symlink=/var/log/boa/error_log /var/log/boa/error-%Y%m%d.log" + +# AccessLog: The location of the access log file. If this does not +# start with /, it is considered relative to the server root. +# Comment out or set to /dev/null (less effective) to disable +# Access logging. + +AccessLog /var/log/boa/access_log +# Please NOTE: Sending the logs to a pipe ('|'), as shown below, +# is somewhat experimental and might fail under heavy load. +# "Usual libc implementations of printf will stall the whole +# process if the receiving end of a pipe stops reading." +#AccessLog "|/usr/sbin/cronolog --symlink=/var/log/boa/access_log /var/log/boa/access-%Y%m%d.log" + +# UseLocaltime: Logical switch. Uncomment to use localtime +# instead of UTC time +#UseLocaltime + +# VerboseCGILogs: this is just a logical switch. +# It simply notes the start and stop times of cgis in the error log +# Comment out to disable. + +#VerboseCGILogs + +# ServerName: the name of this server that should be sent back to +# clients if different than that returned by gethostname + gethostbyname + +#ServerName www.your.org.here + +# VirtualHost: a logical switch. +# Comment out to disable. +# Given DocumentRoot /var/www, requests on interface 'A' or IP 'IP-A' +# become /var/www/IP-A. +# Example: http://localhost/ becomes /var/www/127.0.0.1 +# +# Not used until version 0.93.17.2. This "feature" also breaks commonlog +# output rules, it prepends the interface number to each access_log line. +# You are expected to fix that problem with a postprocessing script. + +#VirtualHost + +# DocumentRoot: The root directory of the HTML documents. +# Comment out to disable server non user files. + +DocumentRoot /var/www + +# UserDir: The name of the directory which is appended onto a user's home +# directory if a ~user request is recieved. + +UserDir public_html + +# DirectoryIndex: Name of the file to use as a pre-written HTML +# directory index. Please MAKE AND USE THESE FILES. On the +# fly creation of directory indexes can be _slow_. +# Comment out to always use DirectoryMaker + +DirectoryIndex index.html + +# DirectoryMaker: Name of program used to create a directory listing. +# Comment out to disable directory listings. If both this and +# DirectoryIndex are commented out, accessing a directory will give +# an error (though accessing files in the directory are still ok). + +DirectoryMaker /usr/lib/boa/boa_indexer + +# DirectoryCache: If DirectoryIndex doesn't exist, and DirectoryMaker +# has been commented out, the the on-the-fly indexing of Boa can be used +# to generate indexes of directories. Be warned that the output is +# extremely minimal and can cause delays when slow disks are used. +# Note: The DirectoryCache must be writable by the same user/group that +# Boa runs as. + +# DirectoryCache /var/spool/boa/dircache + +# KeepAliveMax: Number of KeepAlive requests to allow per connection +# Comment out, or set to 0 to disable keepalive processing + +KeepAliveMax 1000 + +# KeepAliveTimeout: seconds to wait before keepalive connection times out + +KeepAliveTimeout 10 + +# MimeTypes: This is the file that is used to generate mime type pairs +# and Content-Type fields for boa. +# Set to /dev/null if you do not want to load a mime types file. +# Do *not* comment out (better use AddType!) + +MimeTypes /etc/mime.types + +# DefaultType: MIME type used if the file extension is unknown, or there +# is no file extension. + +DefaultType text/plain + +# AddType: adds types without editing mime.types +# Example: AddType type extension [extension ...] + +# Uncomment the next line if you want .cgi files to execute from anywhere +#AddType application/x-httpd-cgi cgi + +# Redirect, Alias, and ScriptAlias all have the same semantics -- they +# match the beginning of a request and take appropriate action. Use +# Redirect for other servers, Alias for the same server, and ScriptAlias +# to enable directories for script execution. + +# Redirect allows you to tell clients about documents which used to exist in +# your server's namespace, but do not anymore. This allows you to tell the +# clients where to look for the relocated document. +# Example: Redirect /bar http://elsewhere/feh/bar + +# Aliases: Aliases one path to another. +# Example: Alias /path1/bar /path2/foo + +# Alias /doc /usr/doc + +# ScriptAlias: Maps a virtual path to a directory for serving scripts +# Example: ScriptAlias /htbin/ /www/htbin/ + +ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + diff --git a/obsolete-buildroot/sources/bridge.patch b/obsolete-buildroot/sources/bridge.patch new file mode 100644 index 0000000000..f44737750b --- /dev/null +++ b/obsolete-buildroot/sources/bridge.patch @@ -0,0 +1,11 @@ +--- bridge-utils-0.9.6/libbridge/Makefile.in.dist 2004-03-01 20:55:52.000000000 -0600 ++++ bridge-utils-0.9.6/libbridge/Makefile.in 2004-03-01 20:56:23.000000000 -0600 +@@ -5,7 +5,7 @@ + RANLIB=@RANLIB@ + + CC=@CC@ +-CFLAGS = -Wall -g $(KERNEL_HEADERS) ++CFLAGS = -Wall -g @CFLAGS@ $(KERNEL_HEADERS) + + prefix=@prefix@ + exec_prefix=@exec_prefix@ diff --git a/obsolete-buildroot/sources/busybox-openwrt-100-killall5.patch b/obsolete-buildroot/sources/busybox-openwrt-100-killall5.patch new file mode 100644 index 0000000000..161b7e6f25 --- /dev/null +++ b/obsolete-buildroot/sources/busybox-openwrt-100-killall5.patch @@ -0,0 +1,87 @@ +diff -urN busybox-dist/include/applets.h busybox/include/applets.h +--- busybox-dist/include/applets.h 2004-03-13 02:33:09.000000000 -0600 ++++ busybox/include/applets.h 2004-03-16 09:45:29.000000000 -0600 +@@ -313,6 +313,9 @@ + #ifdef CONFIG_KILLALL + APPLET(killall, kill_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) + #endif ++#ifdef CONFIG_KILLALL5 ++ APPLET(killall5, kill_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) ++#endif + #ifdef CONFIG_KLOGD + APPLET(klogd, klogd_main, _BB_DIR_SBIN, _BB_SUID_NEVER) + #endif +diff -urN busybox-dist/include/usage.h busybox/include/usage.h +--- busybox-dist/include/usage.h 2004-03-13 02:33:09.000000000 -0600 ++++ busybox/include/usage.h 2004-03-16 09:45:29.000000000 -0600 +@@ -1389,6 +1389,13 @@ + #define killall_example_usage \ + "$ killall apache\n" + ++#define killall5_trivial_usage \ ++ "" ++#define killall5_full_usage \ ++ "" ++#define killall5_example_usage \ ++ "" ++ + #define klogd_trivial_usage \ + "[-c n] [-n]" + #define klogd_full_usage \ +diff -urN busybox-dist/procps/Config.in busybox/procps/Config.in +--- busybox-dist/procps/Config.in 2003-12-24 00:02:11.000000000 -0600 ++++ busybox/procps/Config.in 2004-03-16 09:45:29.000000000 -0600 +@@ -30,6 +30,11 @@ + specified commands. If no signal name is specified, SIGTERM is + sent. + ++config CONFIG_KILLALL5 ++ bool "killall5" ++ default n ++ depends on CONFIG_KILL ++ + config CONFIG_PIDOF + bool "pidof" + default n +diff -urN busybox-dist/procps/kill.c busybox/procps/kill.c +--- busybox-dist/procps/kill.c 2004-03-15 02:29:03.000000000 -0600 ++++ busybox/procps/kill.c 2004-03-16 09:45:29.000000000 -0600 +@@ -34,6 +34,7 @@ + + #define KILL 0 + #define KILLALL 1 ++#define KILLALL5 2 + + extern int kill_main(int argc, char **argv) + { +@@ -47,6 +48,9 @@ + #else + whichApp = KILL; + #endif ++#ifdef CONFIG_KILLALL5 ++ whichApp = (strcmp(bb_applet_name, "killall5") == 0)? KILLALL5 : whichApp; ++#endif + + /* Parse any options */ + if (argc < 2) +@@ -119,6 +123,20 @@ + } + + } ++#ifdef CONFIG_KILLALL5 ++ else if (whichApp == KILLALL5) { ++ procps_status_t * p; ++ pid_t myPid=getpid(); ++ while ((p = procps_scan(0)) != 0) { ++ if (p->pid != 1 && p->pid != myPid && p->pid != p->ppid) { ++ if (kill(p->pid, signo) != 0) { ++ bb_perror_msg( "Could not kill pid '%d'", p->pid); ++ errors++; ++ } ++ } ++ } ++ } ++#endif + #ifdef CONFIG_KILLALL + else { + pid_t myPid=getpid(); diff --git a/obsolete-buildroot/sources/busybox-openwrt-110-telnetd.patch b/obsolete-buildroot/sources/busybox-openwrt-110-telnetd.patch new file mode 100644 index 0000000000..e95757ee4e --- /dev/null +++ b/obsolete-buildroot/sources/busybox-openwrt-110-telnetd.patch @@ -0,0 +1,53 @@ +diff -urN busybox-1.00-pre8/networking/telnetd.c busybox-1.00-pre8-openwrt/networking/telnetd.c +--- busybox-1.00-pre8/networking/telnetd.c 2004-02-22 03:45:57.000000000 -0600 ++++ busybox-1.00-pre8-openwrt/networking/telnetd.c 2004-03-05 01:32:57.000000000 -0600 +@@ -44,6 +44,8 @@ + #include + #include + #include ++#include ++ + + #include "busybox.h" + +@@ -384,11 +386,13 @@ + int portnbr = 23; + #endif /* CONFIG_FEATURE_TELNETD_INETD */ + int c; ++ char *interface_name = NULL; ++ struct ifreq interface; + static const char options[] = + #ifdef CONFIG_FEATURE_TELNETD_INETD +- "f:l:"; +-#else /* CONFIG_EATURE_TELNETD_INETD */ +- "f:l:p:"; ++ "i:f:l:"; ++#else /* CONFIG_FEATURE_TELNETD_INETD */ ++ "i:f:l:p:"; + #endif /* CONFIG_FEATURE_TELNETD_INETD */ + int maxlen, w, r; + +@@ -403,6 +407,9 @@ + case 'f': + issuefile = strdup (optarg); + break; ++ case 'i': ++ interface_name = strdup(optarg); ++ break; + case 'l': + loginpath = strdup (optarg); + break; +@@ -442,6 +449,13 @@ + sa.sin_family = AF_INET; + sa.sin_port = htons(portnbr); + ++ /* Set it to listen on the specified interface */ ++ if (interface_name) { ++ strncpy(interface.ifr_ifrn.ifrn_name, interface_name, IFNAMSIZ); ++ (void)setsockopt(master_fd, SOL_SOCKET, ++ SO_BINDTODEVICE, &interface, sizeof(interface)); ++ } ++ + if (bind(master_fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) { + bb_perror_msg_and_die("bind"); + } diff --git a/obsolete-buildroot/sources/busybox-openwrt-120-udhcp.patch b/obsolete-buildroot/sources/busybox-openwrt-120-udhcp.patch new file mode 100644 index 0000000000..f8e8d33b3a --- /dev/null +++ b/obsolete-buildroot/sources/busybox-openwrt-120-udhcp.patch @@ -0,0 +1,129 @@ +diff -urN busybox-dist/networking/udhcp/dumpleases.c busybox/networking/udhcp/dumpleases.c +--- busybox-dist/networking/udhcp/dumpleases.c 2004-03-15 02:29:00.000000000 -0600 ++++ busybox/networking/udhcp/dumpleases.c 2004-03-16 09:52:32.000000000 -0600 +@@ -42,7 +42,7 @@ + #endif + { + FILE *fp; +- int i, c, mode = REMAINING; ++ int i, c, mode = ABSOLUTE; + long expires; + const char *file = LEASES_FILE; + struct dhcpOfferedAddr lease; +@@ -73,7 +73,7 @@ + + fp = xfopen(file, "r"); + +- printf("Mac Address IP-Address Expires %s\n", mode == REMAINING ? "in" : "at"); ++ printf("Mac Address IP-Address Hostname Expires %s\n", mode == REMAINING ? "in" : "at"); + /* "00:00:00:00:00:00 255.255.255.255 Wed Jun 30 21:49:08 1993" */ + while (fread(&lease, sizeof(lease), 1, fp)) { + +@@ -84,7 +84,8 @@ + addr.s_addr = lease.yiaddr; + printf(" %-15s", inet_ntoa(addr)); + expires = ntohl(lease.expires); +- printf(" "); ++ //expires = lease.expires; ++ printf(" %-15s ",lease.hostname); + if (mode == REMAINING) { + if (!expires) printf("expired\n"); + else { +diff -urN busybox-dist/networking/udhcp/files.c busybox/networking/udhcp/files.c +--- busybox-dist/networking/udhcp/files.c 2004-03-15 02:29:00.000000000 -0600 ++++ busybox/networking/udhcp/files.c 2004-03-16 09:50:04.000000000 -0600 +@@ -281,7 +281,7 @@ + if (lease.yiaddr >= server_config.start && lease.yiaddr <= server_config.end) { + lease.expires = ntohl(lease.expires); + if (!server_config.remaining) lease.expires -= time(0); +- if (!(add_lease(lease.chaddr, lease.yiaddr, lease.expires))) { ++ if (!(add_lease(lease.hostname, lease.chaddr, lease.yiaddr, lease.expires))) { + LOG(LOG_WARNING, "Too many leases while loading %s\n", file); + break; + } +diff -urN busybox-dist/networking/udhcp/leases.c busybox/networking/udhcp/leases.c +--- busybox-dist/networking/udhcp/leases.c 2004-03-15 02:29:00.000000000 -0600 ++++ busybox/networking/udhcp/leases.c 2004-03-16 09:50:04.000000000 -0600 +@@ -35,7 +35,7 @@ + + + /* add a lease into the table, clearing out any old ones */ +-struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease) ++struct dhcpOfferedAddr *add_lease(uint8_t *hostname, uint8_t *chaddr, uint32_t yiaddr, unsigned long lease) + { + struct dhcpOfferedAddr *oldest; + +@@ -45,6 +45,13 @@ + oldest = oldest_expired_lease(); + + if (oldest) { ++ if (hostname) { ++ uint8_t length = *(hostname-1); ++ if (length>15) length=15; ++ memcpy(oldest->hostname,hostname,length); ++ oldest->hostname[length]=0; ++ } ++ + memcpy(oldest->chaddr, chaddr, 16); + oldest->yiaddr = yiaddr; + oldest->expires = time(0) + lease; +@@ -112,7 +119,7 @@ + temp.s_addr = addr; + LOG(LOG_INFO, "%s belongs to someone, reserving it for %ld seconds", + inet_ntoa(temp), server_config.conflict_time); +- add_lease(blank_chaddr, addr, server_config.conflict_time); ++ add_lease(blank_chaddr, blank_chaddr, addr, server_config.conflict_time); + return 1; + } else return 0; + } +diff -urN busybox-dist/networking/udhcp/leases.h busybox/networking/udhcp/leases.h +--- busybox-dist/networking/udhcp/leases.h 2004-01-30 17:45:12.000000000 -0600 ++++ busybox/networking/udhcp/leases.h 2004-03-16 09:50:04.000000000 -0600 +@@ -4,6 +4,7 @@ + + + struct dhcpOfferedAddr { ++ uint8_t hostname[16]; + uint8_t chaddr[16]; + uint32_t yiaddr; /* network order */ + uint32_t expires; /* host order */ +@@ -12,7 +13,7 @@ + extern uint8_t blank_chaddr[]; + + void clear_lease(uint8_t *chaddr, uint32_t yiaddr); +-struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease); ++struct dhcpOfferedAddr *add_lease(uint8_t *hostname, uint8_t *chaddr, uint32_t yiaddr, unsigned long lease); + int lease_expired(struct dhcpOfferedAddr *lease); + struct dhcpOfferedAddr *oldest_expired_lease(void); + struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr); +diff -urN busybox-dist/networking/udhcp/serverpacket.c busybox/networking/udhcp/serverpacket.c +--- busybox-dist/networking/udhcp/serverpacket.c 2004-03-15 02:29:01.000000000 -0600 ++++ busybox/networking/udhcp/serverpacket.c 2004-03-16 09:51:36.000000000 -0600 +@@ -29,6 +29,7 @@ + #include "dhcpd.h" + #include "options.h" + #include "common.h" ++#include "files.h" + + /* send a packet to giaddr using the kernel ip stack */ + static int send_packet_to_relay(struct dhcpMessage *payload) +@@ -152,7 +153,7 @@ + return -1; + } + +- if (!add_lease(packet.chaddr, packet.yiaddr, server_config.offer_time)) { ++ if (!add_lease(get_option(oldpacket, DHCP_HOST_NAME), packet.chaddr, packet.yiaddr, server_config.offer_time)) { + LOG(LOG_WARNING, "lease pool is full -- OFFER abandoned"); + return -1; + } +@@ -233,7 +234,9 @@ + if (send_packet(&packet, 0) < 0) + return -1; + +- add_lease(packet.chaddr, packet.yiaddr, lease_time_align); ++ add_lease(get_option(oldpacket, DHCP_HOST_NAME), packet.chaddr, packet.yiaddr, lease_time_align); ++ ++ write_leases(); + + return 0; + } diff --git a/obsolete-buildroot/sources/busybox-openwrt-130-resetmon.patch b/obsolete-buildroot/sources/busybox-openwrt-130-resetmon.patch new file mode 100644 index 0000000000..b41315e1f7 --- /dev/null +++ b/obsolete-buildroot/sources/busybox-openwrt-130-resetmon.patch @@ -0,0 +1,89 @@ +diff -urN busybox-dist/include/applets.h busybox/include/applets.h +--- busybox-dist/include/applets.h 2004-03-16 09:56:27.000000000 -0600 ++++ busybox/include/applets.h 2004-03-16 10:00:14.000000000 -0600 +@@ -484,6 +484,9 @@ + #ifdef CONFIG_RESET + APPLET(reset, reset_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) + #endif ++#ifdef CONFIG_RESETMON ++ APPLET(resetmon, resetmon_main, _BB_DIR_SBIN, _BB_SUID_NEVER) ++#endif + #ifdef CONFIG_RM + APPLET(rm, rm_main, _BB_DIR_BIN, _BB_SUID_NEVER) + #endif +diff -urN busybox-dist/include/usage.h busybox/include/usage.h +--- busybox-dist/include/usage.h 2004-03-16 09:56:27.000000000 -0600 ++++ busybox/include/usage.h 2004-03-16 10:00:14.000000000 -0600 +@@ -2024,6 +2024,11 @@ + #define reset_full_usage \ + "Resets the screen." + ++#define resetmon_trivial_usage \ ++ "" ++#define resetmon_full_usage \ ++ "Return an exit code of TRUE (0) if reset is NOT pressed." ++ + #define rm_trivial_usage \ + "[OPTION]... FILE..." + #define rm_full_usage \ +diff -urN busybox-dist/miscutils/Config.in busybox/miscutils/Config.in +--- busybox-dist/miscutils/Config.in 2004-03-15 02:28:46.000000000 -0600 ++++ busybox/miscutils/Config.in 2004-03-16 10:00:14.000000000 -0600 +@@ -156,6 +156,12 @@ + to advance or rewind a tape past a specified number of archive + files on the tape. + ++config CONFIG_RESETMON ++ bool "resetmon" ++ default y ++ help ++ Linksys wrt54g reset button monitor. Returns TRUE if NOT pressed. ++ + config CONFIG_RX + bool "rx" + default n +diff -urN busybox-dist/miscutils/Makefile.in busybox/miscutils/Makefile.in +--- busybox-dist/miscutils/Makefile.in 2004-03-15 02:28:46.000000000 -0600 ++++ busybox/miscutils/Makefile.in 2004-03-16 10:00:14.000000000 -0600 +@@ -33,6 +33,7 @@ + MISCUTILS-$(CONFIG_LAST) += last.o + MISCUTILS-$(CONFIG_MAKEDEVS) += makedevs.o + MISCUTILS-$(CONFIG_MT) += mt.o ++MISCUTILS-$(CONFIG_RESETMON) += resetmon.o + MISCUTILS-$(CONFIG_RX) += rx.o + MISCUTILS-$(CONFIG_STRINGS) += strings.o + MISCUTILS-$(CONFIG_TIME) += time.o +diff -urN busybox-dist/miscutils/resetmon.c busybox/miscutils/resetmon.c +--- busybox-dist/miscutils/resetmon.c 1969-12-31 18:00:00.000000000 -0600 ++++ busybox/miscutils/resetmon.c 2004-03-16 10:00:14.000000000 -0600 +@@ -0,0 +1,30 @@ ++#include ++#include ++#include "busybox.h" ++ ++#define RESET (1<<6) ++ ++int resetmon_main(int argc, char **argv) { ++ int fd = -1; ++ unsigned int val=0; ++ ++#if 0 ++ if ((fd = open("/dev/gpio/control",O_RDWR))<0) goto error; ++ read(fd,&val,4); ++ val|=RESET; ++ write(fd,&val,4); ++ ++ if ((fd = open("/dev/gpio/outen",O_RDWR))<0) goto error; ++ read(fd,&val,4); ++ val&=~RESET; ++ write(fd,&val,4); ++#endif ++ ++ if ((fd = open("/dev/gpio/in",O_RDONLY))<0) goto error; ++ read(fd,&val,4); ++ ++ return !(val&RESET); ++ ++error: ++ return 1; ++} diff --git a/obsolete-buildroot/sources/busybox.config b/obsolete-buildroot/sources/busybox.config new file mode 100644 index 0000000000..a461e1fb57 --- /dev/null +++ b/obsolete-buildroot/sources/busybox.config @@ -0,0 +1,459 @@ +# +# Automatically generated make config: don't edit +# +HAVE_DOT_CONFIG=y + +# +# General Configuration +# +# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set +CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_FEATURE_INSTALLER is not set +# CONFIG_LOCALE_SUPPORT is not set +CONFIG_FEATURE_DEVFS=y +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_CLEAN_UP is not set +# CONFIG_FEATURE_SUID is not set +# CONFIG_SELINUX is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +CONFIG_LFS=y +USING_CROSS_COMPILER=y +CROSS_COMPILER_PREFIX="mipsel-uclibc-" +EXTRA_CFLAGS_OPTIONS="-Os " + +# +# Installation Options +# +# CONFIG_INSTALL_NO_USR is not set +PREFIX="./_install" + +# +# Archival Utilities +# +# CONFIG_AR is not set +CONFIG_BUNZIP2=y +# CONFIG_CPIO is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +CONFIG_GUNZIP=y +CONFIG_FEATURE_GUNZIP_UNCOMPRESS=y +CONFIG_GZIP=y +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_BZIP2=y +# CONFIG_FEATURE_TAR_FROM is not set +CONFIG_FEATURE_TAR_GZIP=y +# CONFIG_FEATURE_TAR_COMPRESS is not set +CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY=y +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +# CONFIG_UNCOMPRESS is not set +# CONFIG_UNZIP is not set + +# +# Common options for cpio and tar +# +# CONFIG_FEATURE_UNARCHIVE_TAPE is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +# CONFIG_CAL is not set +CONFIG_CAT=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +CONFIG_CHROOT=y +# CONFIG_CMP is not set +CONFIG_CP=y +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_DD=y +CONFIG_DF=y +# CONFIG_DIRNAME is not set +# CONFIG_DOS2UNIX is not set +# CONFIG_DU is not set +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_EXPR=y +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +# CONFIG_FEATURE_FANCY_HEAD is not set +CONFIG_HOSTID=y +# CONFIG_ID is not set +CONFIG_INSTALL=y +CONFIG_LENGTH=y +CONFIG_LN=y +# CONFIG_LOGNAME is not set +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +CONFIG_MKFIFO=y +# CONFIG_MKNOD is not set +CONFIG_MV=y +# CONFIG_OD is not set +# CONFIG_PRINTF is not set +CONFIG_PWD=y +# CONFIG_REALPATH is not set +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_SEQ is not set +# CONFIG_SHA1SUM is not set +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_SORT=y +# CONFIG_STTY is not set +CONFIG_SYNC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y + +# +# test (forced enabled for use with shell) +# +CONFIG_TOUCH=y +# CONFIG_TR is not set +CONFIG_TRUE=y +# CONFIG_TTY is not set +CONFIG_UNAME=y +CONFIG_UNIQ=y +# CONFIG_USLEEP is not set +# CONFIG_UUDECODE is not set +# CONFIG_UUENCODE is not set +# CONFIG_WATCH is not set +CONFIG_WC=y +# CONFIG_WHO is not set +# CONFIG_WHOAMI is not set +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls and more +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +# CONFIG_CHVT is not set +CONFIG_CLEAR=y +# CONFIG_DEALLOCVT is not set +# CONFIG_DUMPKMAP is not set +# CONFIG_LOADFONT is not set +# CONFIG_LOADKMAP is not set +# CONFIG_OPENVT is not set +CONFIG_RESET=y +# CONFIG_SETKEYCODES is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +# CONFIG_READLINK is not set +CONFIG_RUN_PARTS=y +# CONFIG_START_STOP_DAEMON is not set +CONFIG_WHICH=y + +# +# Editors +# +CONFIG_AWK=y +CONFIG_FEATURE_AWK_MATH=y +CONFIG_PATCH=y +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y + +# +# Finding Utilities +# +CONFIG_FIND=y +# CONFIG_FEATURE_FIND_MTIME is not set +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +# CONFIG_FEATURE_FIND_NEWER is not set +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +CONFIG_INIT=y +CONFIG_FEATURE_USE_INITTAB=y +# CONFIG_FEATURE_INITRD is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_HALT is not set +# CONFIG_POWEROFF is not set +CONFIG_REBOOT=y +CONFIG_MESG=y + +# +# Login/Password Management Utilities +# +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_ADDGROUP is not set +# CONFIG_DELGROUP is not set +# CONFIG_ADDUSER is not set +# CONFIG_DELUSER is not set +# CONFIG_GETTY is not set +# CONFIG_LOGIN is not set +CONFIG_PASSWD=y +# CONFIG_SU is not set +# CONFIG_SULOGIN is not set +# CONFIG_VLOCK is not set + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +CONFIG_CROND=y +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +CONFIG_CRONTAB=y +# CONFIG_DC is not set +# CONFIG_DEVFSD is not set +# CONFIG_LAST is not set +# CONFIG_HDPARM is not set +# CONFIG_MAKEDEVS is not set +# CONFIG_MT is not set +CONFIG_RESETMON=y +# CONFIG_RX is not set +CONFIG_STRINGS=y +CONFIG_TIME=y +# CONFIG_WATCHDOG is not set + +# +# Linux Module Utilities +# +CONFIG_INSMOD=y +# CONFIG_FEATURE_2_2_MODULES is not set +CONFIG_FEATURE_2_4_MODULES=y +# CONFIG_FEATURE_2_6_MODULES is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +CONFIG_LSMOD=y +CONFIG_FEATURE_QUERY_MODULE_INTERFACE=y +# CONFIG_MODPROBE is not set +CONFIG_RMMOD=y +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set + +# +# Networking Utilities +# +CONFIG_FEATURE_IPV6=y +CONFIG_ARPING=y +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_HOSTNAME is not set +CONFIG_HTTPD=y +# CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY is not set +CONFIG_FEATURE_HTTPD_BASIC_AUTH=y +CONFIG_FEATURE_HTTPD_AUTH_MD5=y +CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP=y +# CONFIG_FEATURE_HTTPD_SETUID is not set +CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES=y +CONFIG_FEATURE_HTTPD_CGI=y +CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y +CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +CONFIG_FEATURE_IFCONFIG_HW=y +CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y +# CONFIG_IFUPDOWN is not set +# CONFIG_INETD is not set +# CONFIG_IP is not set +CONFIG_IPCALC=y +CONFIG_FEATURE_IPCALC_FANCY=y +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_NAMEIF is not set +CONFIG_NC=y +CONFIG_NETSTAT=y +CONFIG_NSLOOKUP=y +CONFIG_PING=y +CONFIG_FEATURE_FANCY_PING=y +CONFIG_PING6=y +CONFIG_FEATURE_FANCY_PING6=y +CONFIG_ROUTE=y +# CONFIG_TELNET is not set +CONFIG_TELNETD=y +# CONFIG_FEATURE_TELNETD_INETD is not set +# CONFIG_TFTP is not set +CONFIG_TRACEROUTE=y +CONFIG_FEATURE_TRACEROUTE_VERBOSE=y +CONFIG_VCONFIG=y +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_IP6_LITERAL=y + +# +# udhcp Server/Client +# +CONFIG_UDHCPD=y +CONFIG_UDHCPC=y +CONFIG_DUMPLEASES=y +# CONFIG_FEATURE_UDHCP_SYSLOG is not set +# CONFIG_FEATURE_UDHCP_DEBUG is not set + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_KILLALL5=y +CONFIG_PIDOF=y +CONFIG_PS=y +# CONFIG_RENICE is not set +CONFIG_TOP=y +FEATURE_CPU_USAGE_PERCENTAGE=y +CONFIG_UPTIME=y +CONFIG_SYSCTL=y + +# +# Another Bourne-like Shell +# +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_LASH is not set +# CONFIG_FEATURE_SH_IS_MSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +CONFIG_ASH=y + +# +# Ash Shell Options +# +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_MATH_SUPPORT=y +CONFIG_ASH_GETOPTS=y +CONFIG_ASH_CMDCMD=y +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +# CONFIG_ASH_RANDOM_SUPPORT is not set +# CONFIG_HUSH is not set +# CONFIG_LASH is not set +# CONFIG_MSH is not set + +# +# Bourne Shell Options +# +# CONFIG_FEATURE_SH_EXTRA_QUIET is not set +# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set +CONFIG_FEATURE_COMMAND_EDITING=y +CONFIG_FEATURE_COMMAND_HISTORY=15 +# CONFIG_FEATURE_COMMAND_SAVEHISTORY is not set +CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y +# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set +CONFIG_FEATURE_SH_FANCY_PROMPT=y + +# +# System Logging Utilities +# +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +CONFIG_FEATURE_REMOTE_LOG=y +CONFIG_FEATURE_IPC_SYSLOG=y +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 +CONFIG_LOGREAD=y +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +CONFIG_KLOGD=y +CONFIG_LOGGER=y + +# +# Linux System Utilities +# +CONFIG_DMESG=y +# CONFIG_FBSET is not set +# CONFIG_FDFLUSH is not set +# CONFIG_FDFORMAT is not set +# CONFIG_FDISK is not set +# CONFIG_FREERAMDISK is not set +# CONFIG_FSCK_MINIX is not set +# CONFIG_MKFS_MINIX is not set +# CONFIG_GETOPT is not set +CONFIG_HEXDUMP=y +# CONFIG_HWCLOCK is not set +# CONFIG_LOSETUP is not set +# CONFIG_MKSWAP is not set +CONFIG_MORE=y +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +# CONFIG_SWAPONOFF is not set +CONFIG_MOUNT=y +CONFIG_NFSMOUNT=y +CONFIG_UMOUNT=y +CONFIG_FEATURE_MOUNT_FORCE=y + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set + +# +# Debugging Options +# +# CONFIG_DEBUG is not set diff --git a/obsolete-buildroot/sources/busybox.config-openwrt b/obsolete-buildroot/sources/busybox.config-openwrt new file mode 100644 index 0000000000..488e331e34 --- /dev/null +++ b/obsolete-buildroot/sources/busybox.config-openwrt @@ -0,0 +1,478 @@ +# +# Automatically generated make config: don't edit +# +HAVE_DOT_CONFIG=y + +# +# General Configuration +# +# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set +CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_FEATURE_INSTALLER is not set +# CONFIG_LOCALE_SUPPORT is not set +CONFIG_FEATURE_DEVFS=y +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_CLEAN_UP is not set +# CONFIG_FEATURE_SUID is not set +# CONFIG_SELINUX is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +CONFIG_LFS=y +USING_CROSS_COMPILER=y +CROSS_COMPILER_PREFIX="mipsel-uclibc-" +EXTRA_CFLAGS_OPTIONS="-Os " + +# +# Installation Options +# +# CONFIG_INSTALL_NO_USR is not set +PREFIX="./_install" + +# +# Archival Utilities +# +# CONFIG_AR is not set +CONFIG_BUNZIP2=y +# CONFIG_CPIO is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +CONFIG_GUNZIP=y +CONFIG_FEATURE_GUNZIP_UNCOMPRESS=y +CONFIG_GZIP=y +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_BZIP2=y +# CONFIG_FEATURE_TAR_FROM is not set +CONFIG_FEATURE_TAR_GZIP=y +# CONFIG_FEATURE_TAR_COMPRESS is not set +CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY=y +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +# CONFIG_UNCOMPRESS is not set +# CONFIG_UNZIP is not set + +# +# Common options for cpio and tar +# +# CONFIG_FEATURE_UNARCHIVE_TAPE is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +# CONFIG_CAL is not set +CONFIG_CAT=y +# CONFIG_CHGRP is not set +CONFIG_CHMOD=y +# CONFIG_CHOWN is not set +CONFIG_CHROOT=y +# CONFIG_CMP is not set +CONFIG_CP=y +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_DD=y +CONFIG_DF=y +# CONFIG_DIRNAME is not set +# CONFIG_DOS2UNIX is not set +# CONFIG_DU is not set +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_EXPR=y +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +# CONFIG_FEATURE_FANCY_HEAD is not set +CONFIG_HOSTID=y +# CONFIG_ID is not set +CONFIG_INSTALL=y +CONFIG_LENGTH=y +CONFIG_LN=y +# CONFIG_LOGNAME is not set +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +CONFIG_MKFIFO=y +# CONFIG_MKNOD is not set +CONFIG_MV=y +# CONFIG_OD is not set +# CONFIG_PRINTF is not set +CONFIG_PWD=y +# CONFIG_REALPATH is not set +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_SEQ is not set +# CONFIG_SHA1SUM is not set +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_SORT=y +# CONFIG_STTY is not set +CONFIG_SYNC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y + +# +# test (forced enabled for use with shell) +# +CONFIG_TOUCH=y +# CONFIG_TR is not set +CONFIG_TRUE=y +# CONFIG_TTY is not set +CONFIG_UNAME=y +CONFIG_UNIQ=y +# CONFIG_USLEEP is not set +# CONFIG_UUDECODE is not set +# CONFIG_UUENCODE is not set +# CONFIG_WATCH is not set +CONFIG_WC=y +# CONFIG_WHO is not set +# CONFIG_WHOAMI is not set +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls and more +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +# CONFIG_CHVT is not set +CONFIG_CLEAR=y +# CONFIG_DEALLOCVT is not set +# CONFIG_DUMPKMAP is not set +# CONFIG_LOADFONT is not set +# CONFIG_LOADKMAP is not set +# CONFIG_OPENVT is not set +CONFIG_RESET=y +# CONFIG_SETKEYCODES is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +# CONFIG_READLINK is not set +CONFIG_RUN_PARTS=y +# CONFIG_START_STOP_DAEMON is not set +CONFIG_WHICH=y + +# +# Editors +# +CONFIG_AWK=y +CONFIG_FEATURE_AWK_MATH=y +CONFIG_PATCH=y +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y + +# +# Finding Utilities +# +CONFIG_FIND=y +# CONFIG_FEATURE_FIND_MTIME is not set +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +# CONFIG_FEATURE_FIND_NEWER is not set +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +CONFIG_INIT=y +CONFIG_FEATURE_USE_INITTAB=y +# CONFIG_FEATURE_INITRD is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_HALT is not set +# CONFIG_POWEROFF is not set +CONFIG_REBOOT=y +CONFIG_MESG=y + +# +# Login/Password Management Utilities +# +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_ADDGROUP is not set +# CONFIG_DELGROUP is not set +# CONFIG_ADDUSER is not set +# CONFIG_DELUSER is not set +# CONFIG_GETTY is not set +# CONFIG_LOGIN is not set +CONFIG_PASSWD=y +# CONFIG_SU is not set +# CONFIG_SULOGIN is not set +# CONFIG_VLOCK is not set + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +CONFIG_CROND=y +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +CONFIG_CRONTAB=y +# CONFIG_DC is not set +# CONFIG_DEVFSD is not set +# CONFIG_LAST is not set +# CONFIG_HDPARM is not set +# CONFIG_MAKEDEVS is not set +# CONFIG_MT is not set +CONFIG_RESETMON=y +# CONFIG_RX is not set +CONFIG_STRINGS=y +CONFIG_TIME=y +# CONFIG_WATCHDOG is not set + +# +# Linux Module Utilities +# +CONFIG_INSMOD=y +# CONFIG_FEATURE_2_2_MODULES is not set +CONFIG_FEATURE_2_4_MODULES=y +# CONFIG_FEATURE_2_6_MODULES is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_LSMOD is not set +# CONFIG_MODPROBE is not set +CONFIG_RMMOD=y +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set + +# +# Networking Utilities +# +CONFIG_FEATURE_IPV6=y +CONFIG_ARPING=y +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_HOSTNAME is not set +CONFIG_HTTPD=y +# CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY is not set +CONFIG_FEATURE_HTTPD_BASIC_AUTH=y +CONFIG_FEATURE_HTTPD_AUTH_MD5=y +CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP=y +# CONFIG_FEATURE_HTTPD_SETUID is not set +CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES=y +CONFIG_FEATURE_HTTPD_CGI=y +CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y +CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +CONFIG_FEATURE_IFCONFIG_HW=y +CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y +# CONFIG_IFUPDOWN is not set +# CONFIG_INETD is not set +CONFIG_IP=y +CONFIG_FEATURE_IP_ADDRESS=y + +# +# address (forced enabled for ipaddr) +# +CONFIG_FEATURE_IP_LINK=y + +# +# link (forced enabled for iplink) +# +CONFIG_FEATURE_IP_ROUTE=y + +# +# route (forced enabled for iproute) +# +CONFIG_FEATURE_IP_TUNNEL=y + +# +# tunnel (forced enabled for iptunnel) +# +CONFIG_IPCALC=y +CONFIG_FEATURE_IPCALC_FANCY=y +CONFIG_IPADDR=y +CONFIG_IPLINK=y +CONFIG_IPROUTE=y +CONFIG_IPTUNNEL=y +CONFIG_NAMEIF=y +CONFIG_NC=y +CONFIG_NETSTAT=y +CONFIG_NSLOOKUP=y +CONFIG_PING=y +CONFIG_FEATURE_FANCY_PING=y +CONFIG_PING6=y +CONFIG_FEATURE_FANCY_PING6=y +CONFIG_ROUTE=y +# CONFIG_TELNET is not set +CONFIG_TELNETD=y +# CONFIG_FEATURE_TELNETD_INETD is not set +# CONFIG_TFTP is not set +CONFIG_TRACEROUTE=y +CONFIG_FEATURE_TRACEROUTE_VERBOSE=y +CONFIG_VCONFIG=y +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_IP6_LITERAL=y + +# +# udhcp Server/Client +# +CONFIG_UDHCPD=y +CONFIG_UDHCPC=y +CONFIG_DUMPLEASES=y +# CONFIG_FEATURE_UDHCP_SYSLOG is not set +# CONFIG_FEATURE_UDHCP_DEBUG is not set + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_KILLALL5=y +CONFIG_PIDOF=y +CONFIG_PS=y +# CONFIG_RENICE is not set +CONFIG_TOP=y +FEATURE_CPU_USAGE_PERCENTAGE=y +CONFIG_UPTIME=y +# CONFIG_SYSCTL is not set + +# +# Another Bourne-like Shell +# +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_LASH is not set +# CONFIG_FEATURE_SH_IS_MSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +CONFIG_ASH=y + +# +# Ash Shell Options +# +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_MATH_SUPPORT=y +CONFIG_ASH_GETOPTS=y +CONFIG_ASH_CMDCMD=y +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +# CONFIG_ASH_RANDOM_SUPPORT is not set +# CONFIG_HUSH is not set +# CONFIG_LASH is not set +# CONFIG_MSH is not set + +# +# Bourne Shell Options +# +CONFIG_FEATURE_SH_EXTRA_QUIET=y +# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set +CONFIG_FEATURE_COMMAND_EDITING=y +CONFIG_FEATURE_COMMAND_HISTORY=15 +# CONFIG_FEATURE_COMMAND_SAVEHISTORY is not set +CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y +# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set +CONFIG_FEATURE_SH_FANCY_PROMPT=y + +# +# System Logging Utilities +# +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +CONFIG_FEATURE_REMOTE_LOG=y +CONFIG_FEATURE_IPC_SYSLOG=y +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 +CONFIG_LOGREAD=y +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +CONFIG_KLOGD=y +CONFIG_LOGGER=y + +# +# Linux System Utilities +# +CONFIG_DMESG=y +# CONFIG_FBSET is not set +# CONFIG_FDFLUSH is not set +# CONFIG_FDFORMAT is not set +# CONFIG_FDISK is not set +# CONFIG_FREERAMDISK is not set +# CONFIG_FSCK_MINIX is not set +# CONFIG_MKFS_MINIX is not set +# CONFIG_GETOPT is not set +CONFIG_HEXDUMP=y +# CONFIG_HWCLOCK is not set +# CONFIG_LOSETUP is not set +# CONFIG_MKSWAP is not set +CONFIG_MORE=y +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +# CONFIG_SWAPONOFF is not set +CONFIG_MOUNT=y +CONFIG_NFSMOUNT=y +CONFIG_UMOUNT=y +CONFIG_FEATURE_MOUNT_FORCE=y + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set + +# +# Debugging Options +# +# CONFIG_DEBUG is not set diff --git a/obsolete-buildroot/sources/cramfs.patch b/obsolete-buildroot/sources/cramfs.patch new file mode 100644 index 0000000000..884eb8cb83 --- /dev/null +++ b/obsolete-buildroot/sources/cramfs.patch @@ -0,0 +1,1269 @@ +--- cramfs-1.1.orig/cramfsck.c 2002-02-22 17:00:42.000000000 -0700 ++++ cramfs-1.1/cramfsck.c 2002-12-21 01:25:17.000000000 -0700 +@@ -51,10 +51,11 @@ + #include + #include + #define _LINUX_STRING_H_ +-#include +-#include ++#include "linux/cramfs_fs.h" + #include + ++#define BLKGETSIZE _IO(0x12,96) /* return device size /512 (long *arg) */ ++ + /* Exit codes used by fsck-type programs */ + #define FSCK_OK 0 /* No errors */ + #define FSCK_NONDESTRUCT 1 /* File system errors corrected */ +@@ -75,7 +76,7 @@ + static int opt_verbose = 0; /* 1 = verbose (-v), 2+ = very verbose (-vv) */ + #ifdef INCLUDE_FS_TESTS + static int opt_extract = 0; /* extract cramfs (-x) */ +-static char *extract_dir = "root"; /* extraction directory (-x) */ ++static char *extract_dir = "/"; /* extraction directory (-x) */ + static uid_t euid; /* effective UID */ + + /* (cramfs_super + start) <= start_dir < end_dir <= start_data <= end_data */ +@@ -155,7 +156,7 @@ + } + + if (*length < sizeof(struct cramfs_super)) { +- die(FSCK_UNCORRECTED, 0, "file length too short"); ++ die(FSCK_UNCORRECTED, 0, "filesystem smaller than a cramfs superblock!"); + } + + /* find superblock */ +@@ -190,7 +191,8 @@ + die(FSCK_UNCORRECTED, 0, "zero file count"); + } + if (*length < super.size) { +- die(FSCK_UNCORRECTED, 0, "file length too short"); ++ die(FSCK_UNCORRECTED, 0, "file length too short, %lu is smaller than %lu", ++ *length, super.size); + } + else if (*length > super.size) { + fprintf(stderr, "warning: file extends past end of filesystem\n"); +@@ -267,11 +269,11 @@ + #ifdef INCLUDE_FS_TESTS + static void print_node(char type, struct cramfs_inode *i, char *name) + { +- char info[10]; ++ char info[11]; + + if (S_ISCHR(i->mode) || (S_ISBLK(i->mode))) { + /* major/minor numbers can be as high as 2^12 or 4096 */ +- snprintf(info, 10, "%4d,%4d", major(i->size), minor(i->size)); ++ snprintf(info, 11, "%4d,%4d", major(i->size), minor(i->size)); + } + else { + /* size be as high as 2^24 or 16777216 */ +@@ -445,8 +447,10 @@ + } + /* TODO: Do we need to check end_dir for empty case? */ + memcpy(newpath, path, pathlen); +- newpath[pathlen] = '/'; +- pathlen++; ++ if (pathlen > 1) { ++ newpath[pathlen] = '/'; ++ pathlen++; ++ } + if (opt_verbose) { + print_node('d', i, path); + } +--- cramfs-1.1.orig/device_table.txt 1969-12-31 17:00:00.000000000 -0700 ++++ cramfs-1.1/device_table.txt 2003-01-01 05:13:44.000000000 -0700 +@@ -0,0 +1,129 @@ ++# When building a target filesystem, it is desirable to not have to ++# become root and then run 'mknod' a thousand times. Using a device ++# table you can create device nodes and directories "on the fly". ++# ++# This is a sample device table file for use with mkcramfs. You can ++# do all sorts of interesting things with a device table file. For ++# example, if you want to adjust the permissions on a particular file ++# you can just add an entry like: ++# /sbin/foobar f 2755 0 0 - - - - - ++# and (assuming the file /sbin/foobar exists) it will be made setuid ++# root (regardless of what its permissions are on the host filesystem. ++# Furthermore, you can use a single table entry to create a many device ++# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] ++# I could just use the following two table entries: ++# /dev/hda b 640 0 0 3 0 0 0 - ++# /dev/hda b 640 0 0 3 1 1 1 15 ++# ++# Device table entries take the form of: ++# ++# where name is the file name, type can be one of: ++# f A regular file ++# d Directory ++# c Character special device file ++# b Block special device file ++# p Fifo (named pipe) ++# uid is the user id for the target file, gid is the group id for the ++# target file. The rest of the entries (major, minor, etc) apply only ++# to device special files. ++ ++# Have fun ++# -Erik Andersen ++# ++ ++# ++/dev d 755 0 0 - - - - - ++/dev/mem c 640 0 0 1 1 0 0 - ++/dev/kmem c 640 0 0 1 2 0 0 - ++/dev/null c 640 0 0 1 3 0 0 - ++/dev/zero c 640 0 0 1 5 0 0 - ++/dev/random c 640 0 0 1 8 0 0 - ++/dev/urandom c 640 0 0 1 9 0 0 - ++/dev/tty c 666 0 0 5 0 0 0 - ++/dev/tty c 666 0 0 4 0 0 1 6 ++/dev/console c 640 0 0 5 1 0 0 - ++/dev/ram b 640 0 0 1 1 0 0 - ++/dev/ram b 640 0 0 1 0 0 1 4 ++/dev/loop b 640 0 0 7 0 0 1 2 ++/dev/ptmx c 666 0 0 5 2 0 0 - ++#/dev/ttyS c 640 0 0 4 64 0 1 4 ++#/dev/psaux c 640 0 0 10 1 0 0 - ++#/dev/rtc c 640 0 0 10 135 0 0 - ++ ++# Adjust permissions on some normal files ++#/etc/shadow f 600 0 0 - - - - - ++#/bin/tinylogin f 4755 0 0 - - - - - ++ ++# User-mode Linux stuff ++/dev/ubda b 640 0 0 98 0 0 0 - ++/dev/ubda b 640 0 0 98 1 1 1 15 ++ ++# IDE Devices ++/dev/hda b 640 0 0 3 0 0 0 - ++/dev/hda b 640 0 0 3 1 1 1 15 ++/dev/hdb b 640 0 0 3 64 0 0 - ++/dev/hdb b 640 0 0 3 65 1 1 15 ++#/dev/hdc b 640 0 0 22 0 0 0 - ++#/dev/hdc b 640 0 0 22 1 1 1 15 ++#/dev/hdd b 640 0 0 22 64 0 0 - ++#/dev/hdd b 640 0 0 22 65 1 1 15 ++#/dev/hde b 640 0 0 33 0 0 0 - ++#/dev/hde b 640 0 0 33 1 1 1 15 ++#/dev/hdf b 640 0 0 33 64 0 0 - ++#/dev/hdf b 640 0 0 33 65 1 1 15 ++#/dev/hdg b 640 0 0 34 0 0 0 - ++#/dev/hdg b 640 0 0 34 1 1 1 15 ++#/dev/hdh b 640 0 0 34 64 0 0 - ++#/dev/hdh b 640 0 0 34 65 1 1 15 ++ ++# SCSI Devices ++#/dev/sda b 640 0 0 8 0 0 0 - ++#/dev/sda b 640 0 0 8 1 1 1 15 ++#/dev/sdb b 640 0 0 8 16 0 0 - ++#/dev/sdb b 640 0 0 8 17 1 1 15 ++#/dev/sdc b 640 0 0 8 32 0 0 - ++#/dev/sdc b 640 0 0 8 33 1 1 15 ++#/dev/sdd b 640 0 0 8 48 0 0 - ++#/dev/sdd b 640 0 0 8 49 1 1 15 ++#/dev/sde b 640 0 0 8 64 0 0 - ++#/dev/sde b 640 0 0 8 65 1 1 15 ++#/dev/sdf b 640 0 0 8 80 0 0 - ++#/dev/sdf b 640 0 0 8 81 1 1 15 ++#/dev/sdg b 640 0 0 8 96 0 0 - ++#/dev/sdg b 640 0 0 8 97 1 1 15 ++#/dev/sdh b 640 0 0 8 112 0 0 - ++#/dev/sdh b 640 0 0 8 113 1 1 15 ++#/dev/sg c 640 0 0 21 0 0 1 15 ++#/dev/scd b 640 0 0 11 0 0 1 15 ++#/dev/st c 640 0 0 9 0 0 1 8 ++#/dev/nst c 640 0 0 9 128 0 1 8 ++#/dev/st c 640 0 0 9 32 1 1 4 ++#/dev/st c 640 0 0 9 64 1 1 4 ++#/dev/st c 640 0 0 9 96 1 1 4 ++ ++# Floppy disk devices ++#/dev/fd b 640 0 0 2 0 0 1 2 ++#/dev/fd0d360 b 640 0 0 2 4 0 0 - ++#/dev/fd1d360 b 640 0 0 2 5 0 0 - ++#/dev/fd0h1200 b 640 0 0 2 8 0 0 - ++#/dev/fd1h1200 b 640 0 0 2 9 0 0 - ++#/dev/fd0u1440 b 640 0 0 2 28 0 0 - ++#/dev/fd1u1440 b 640 0 0 2 29 0 0 - ++#/dev/fd0u2880 b 640 0 0 2 32 0 0 - ++#/dev/fd1u2880 b 640 0 0 2 33 0 0 - ++ ++# All the proprietary cdrom devices in the world ++#/dev/aztcd b 640 0 0 29 0 0 0 - ++#/dev/bpcd b 640 0 0 41 0 0 0 - ++#/dev/capi20 c 640 0 0 68 0 0 1 2 ++#/dev/cdu31a b 640 0 0 15 0 0 0 - ++#/dev/cdu535 b 640 0 0 24 0 0 0 - ++#/dev/cm206cd b 640 0 0 32 0 0 0 - ++#/dev/sjcd b 640 0 0 18 0 0 0 - ++#/dev/sonycd b 640 0 0 15 0 0 0 - ++#/dev/gscd b 640 0 0 16 0 0 0 - ++#/dev/sbpcd b 640 0 0 25 0 0 0 - ++#/dev/sbpcd b 640 0 0 25 0 0 1 4 ++#/dev/mcd b 640 0 0 23 0 0 0 - ++#/dev/optcd b 640 0 0 17 0 0 0 - ++ +--- cramfs-1.1.orig/mkcramfs.c 2002-02-20 01:03:32.000000000 -0700 ++++ cramfs-1.1/mkcramfs.c 2002-12-21 01:25:17.000000000 -0700 +@@ -1,3 +1,4 @@ ++/* vi: set sw=8 ts=8: */ + /* + * mkcramfs - make a cramfs file system + * +@@ -16,12 +17,21 @@ + * 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 ++ * ++ * Added device table support (code taken from mkfs.jffs2.c, credit to ++ * Erik Andersen ) as well as an option to squash ++ * permissions. - Russ Dill September 2002 ++ * ++ * Reworked, cleaned up, and updated for cramfs-1.1, December 2002 ++ * - Erik Andersen ++ * + */ + + /* + * If you change the disk format of cramfs, please update fs/cramfs/README. + */ + ++#define _GNU_SOURCE + #include + #include + #include +@@ -33,8 +43,15 @@ + #include + #include + #include ++#include ++#include ++#include ++#include + #include + #include ++#ifdef DMALLOC ++#include ++#endif + + /* Exit codes used by mkfs-type programs */ + #define MKFS_OK 0 /* No errors */ +@@ -71,11 +88,17 @@ + + (1 << CRAMFS_SIZE_WIDTH) - 1 /* filesize */ \ + + (1 << CRAMFS_SIZE_WIDTH) * 4 / PAGE_CACHE_SIZE /* block pointers */ ) + ++ ++/* The kernel assumes PAGE_CACHE_SIZE as block size. */ ++#define PAGE_CACHE_SIZE (4096) ++ ++ + static const char *progname = "mkcramfs"; + static unsigned int blksize = PAGE_CACHE_SIZE; + static long total_blocks = 0, total_nodes = 1; /* pre-count the root node */ + static int image_length = 0; + ++ + /* + * If opt_holes is set, then mkcramfs can create explicit holes in the + * data, which saves 26 bytes per hole (which is a lot smaller a +@@ -91,10 +114,12 @@ + static int opt_holes = 0; + static int opt_pad = 0; + static int opt_verbose = 0; ++static int opt_squash = 0; + static char *opt_image = NULL; + static char *opt_name = NULL; + + static int warn_dev, warn_gid, warn_namelen, warn_skip, warn_size, warn_uid; ++static const char *const memory_exhausted = "memory exhausted"; + + /* In-core version of inode / directory entry. */ + struct entry { +@@ -123,7 +148,7 @@ + { + FILE *stream = status ? stderr : stdout; + +- fprintf(stream, "usage: %s [-h] [-e edition] [-i file] [-n name] dirname outfile\n" ++ fprintf(stream, "usage: %s [-h] [-e edition] [-i file] [-n name] [-D file] dirname outfile\n" + " -h print this help\n" + " -E make all warnings errors (non-zero exit status)\n" + " -e edition set edition number (part of fsid)\n" +@@ -133,39 +158,157 @@ + " -s sort directory entries (old option, ignored)\n" + " -v be more verbose\n" + " -z make explicit holes (requires >= 2.3.39)\n" +- " dirname root of the directory tree to be compressed\n" ++ " -D Use the named FILE as a device table file\n" ++ " -q squash permissions (make everything owned by root)\n" ++ " dirname root of the filesystem to be compressed\n" + " outfile output file\n", progname, PAD_SIZE); + + exit(status); + } + +-static void die(int status, int syserr, const char *fmt, ...) ++static void verror_msg(const char *s, va_list p) ++{ ++ fflush(stdout); ++ fprintf(stderr, "mkcramfs: "); ++ vfprintf(stderr, s, p); ++} ++ ++static void vperror_msg(const char *s, va_list p) ++{ ++ int err = errno; ++ ++ if (s == 0) ++ s = ""; ++ verror_msg(s, p); ++ if (*s) ++ s = ": "; ++ fprintf(stderr, "%s%s\n", s, strerror(err)); ++} ++ ++static void perror_msg(const char *s, ...) ++{ ++ va_list p; ++ ++ va_start(p, s); ++ vperror_msg(s, p); ++ va_end(p); ++} ++ ++static void error_msg_and_die(const char *s, ...) ++{ ++ va_list p; ++ ++ va_start(p, s); ++ verror_msg(s, p); ++ va_end(p); ++ putc('\n', stderr); ++ exit(MKFS_ERROR); ++} ++ ++static void perror_msg_and_die(const char *s, ...) ++{ ++ va_list p; ++ ++ va_start(p, s); ++ vperror_msg(s, p); ++ va_end(p); ++ exit(MKFS_ERROR); ++} ++#ifndef DMALLOC ++extern char *xstrdup(const char *s) ++{ ++ char *t; ++ ++ if (s == NULL) ++ return NULL; ++ t = strdup(s); ++ if (t == NULL) ++ error_msg_and_die(memory_exhausted); ++ return t; ++} ++ ++extern void *xmalloc(size_t size) ++{ ++ void *ptr = malloc(size); ++ ++ if (ptr == NULL && size != 0) ++ error_msg_and_die(memory_exhausted); ++ return ptr; ++} ++ ++extern void *xcalloc(size_t nmemb, size_t size) ++{ ++ void *ptr = calloc(nmemb, size); ++ ++ if (ptr == NULL && nmemb != 0 && size != 0) ++ error_msg_and_die(memory_exhausted); ++ return ptr; ++} ++ ++extern void *xrealloc(void *ptr, size_t size) ++{ ++ ptr = realloc(ptr, size); ++ if (ptr == NULL && size != 0) ++ error_msg_and_die(memory_exhausted); ++ return ptr; ++} ++#endif ++ ++static FILE *xfopen(const char *path, const char *mode) + { +- va_list arg_ptr; +- int save = errno; ++ FILE *fp; ++ ++ if ((fp = fopen(path, mode)) == NULL) ++ perror_msg_and_die("%s", path); ++ return fp; ++} + +- fflush(0); +- va_start(arg_ptr, fmt); +- fprintf(stderr, "%s: ", progname); +- vfprintf(stderr, fmt, arg_ptr); +- if (syserr) { +- fprintf(stderr, ": %s", strerror(save)); ++extern int xopen(const char *pathname, int flags, mode_t mode) ++{ ++ int ret; ++ ++ if (flags & O_CREAT) ++ ret = open(pathname, flags, mode); ++ else ++ ret = open(pathname, flags); ++ if (ret == -1) { ++ perror_msg_and_die("%s", pathname); + } +- fprintf(stderr, "\n"); +- va_end(arg_ptr); +- exit(status); ++ return ret; + } + ++extern char *xreadlink(const char *path) ++{ ++ static const int GROWBY = 80; /* how large we will grow strings by */ ++ ++ char *buf = NULL; ++ int bufsize = 0, readsize = 0; ++ ++ do { ++ buf = xrealloc(buf, bufsize += GROWBY); ++ readsize = readlink(path, buf, bufsize); /* 1st try */ ++ if (readsize == -1) { ++ perror_msg("%s:%s", progname, path); ++ return NULL; ++ } ++ } ++ while (bufsize < readsize + 1); ++ ++ buf[readsize] = '\0'; ++ ++ return buf; ++} ++ + static void map_entry(struct entry *entry) + { + if (entry->path) { + entry->fd = open(entry->path, O_RDONLY); + if (entry->fd < 0) { +- die(MKFS_ERROR, 1, "open failed: %s", entry->path); ++ error_msg_and_die("open failed: %s", entry->path); + } + entry->uncompressed = mmap(NULL, entry->size, PROT_READ, MAP_PRIVATE, entry->fd, 0); + if (entry->uncompressed == MAP_FAILED) { +- die(MKFS_ERROR, 1, "mmap failed: %s", entry->path); ++ error_msg_and_die("mmap failed: %s", entry->path); + } + } + } +@@ -174,8 +317,9 @@ + { + if (entry->path) { + if (munmap(entry->uncompressed, entry->size) < 0) { +- die(MKFS_ERROR, 1, "munmap failed: %s", entry->path); ++ error_msg_and_die("munmap failed: %s", entry->path); + } ++ entry->uncompressed=NULL; + close(entry->fd); + } + } +@@ -204,7 +348,8 @@ + find_identical_file(orig->next, newfile)); + } + +-static void eliminate_doubles(struct entry *root, struct entry *orig) { ++static void eliminate_doubles(struct entry *root, struct entry *orig) ++{ + if (orig) { + if (orig->size && (orig->path || orig->uncompressed)) + find_identical_file(root, orig); +@@ -232,10 +377,7 @@ + + /* Set up the path. */ + /* TODO: Reuse the parent's buffer to save memcpy'ing and duplication. */ +- path = malloc(len + 1 + MAX_INPUT_NAMELEN + 1); +- if (!path) { +- die(MKFS_ERROR, 1, "malloc failed"); +- } ++ path = xmalloc(len + 1 + MAX_INPUT_NAMELEN + 1); + memcpy(path, name, len); + endpath = path + len; + *endpath = '/'; +@@ -245,7 +387,7 @@ + dircount = scandir(name, &dirlist, 0, cramsort); + + if (dircount < 0) { +- die(MKFS_ERROR, 1, "scandir failed: %s", name); ++ error_msg_and_die("scandir failed: %s", name); + } + + /* process directory */ +@@ -269,25 +411,20 @@ + } + namelen = strlen(dirent->d_name); + if (namelen > MAX_INPUT_NAMELEN) { +- die(MKFS_ERROR, 0, +- "very long (%u bytes) filename found: %s\n" +- "please increase MAX_INPUT_NAMELEN in mkcramfs.c and recompile", ++ error_msg_and_die( ++ "Very long (%u bytes) filename `%s' found.\n" ++ " Please increase MAX_INPUT_NAMELEN in mkcramfs.c and recompile. Exiting.\n", + namelen, dirent->d_name); + } + memcpy(endpath, dirent->d_name, namelen + 1); + + if (lstat(path, &st) < 0) { ++ perror(endpath); + warn_skip = 1; + continue; + } +- entry = calloc(1, sizeof(struct entry)); +- if (!entry) { +- die(MKFS_ERROR, 1, "calloc failed"); +- } +- entry->name = strdup(dirent->d_name); +- if (!entry->name) { +- die(MKFS_ERROR, 1, "strdup failed"); +- } ++ entry = xcalloc(1, sizeof(struct entry)); ++ entry->name = xstrdup(dirent->d_name); + /* truncate multi-byte UTF-8 filenames on character boundary */ + if (namelen > CRAMFS_MAXPATHLEN) { + namelen = CRAMFS_MAXPATHLEN; +@@ -297,24 +434,25 @@ + namelen--; + /* are we reasonably certain it was UTF-8 ? */ + if (entry->name[namelen] < 0x80 || !namelen) { +- die(MKFS_ERROR, 0, "cannot truncate filenames not encoded in UTF-8"); ++ error_msg_and_die("cannot truncate filenames not encoded in UTF-8"); + } + } + entry->name[namelen] = '\0'; + } + entry->mode = st.st_mode; + entry->size = st.st_size; +- entry->uid = st.st_uid; ++ entry->uid = opt_squash ? 0 : st.st_uid; + if (entry->uid >= 1 << CRAMFS_UID_WIDTH) + warn_uid = 1; +- entry->gid = st.st_gid; +- if (entry->gid >= 1 << CRAMFS_GID_WIDTH) ++ entry->gid = opt_squash ? 0 : st.st_gid; ++ if (entry->gid >= 1 << CRAMFS_GID_WIDTH) { + /* TODO: We ought to replace with a default + gid instead of truncating; otherwise there + are security problems. Maybe mode should + be &= ~070. Same goes for uid once Linux + supports >16-bit uids. */ + warn_gid = 1; ++ } + size = sizeof(struct cramfs_inode) + ((namelen + 3) & ~3); + *fslen_ub += size; + if (S_ISDIR(st.st_mode)) { +@@ -325,21 +463,15 @@ + warn_skip = 1; + continue; + } +- entry->path = strdup(path); +- if (!entry->path) { +- die(MKFS_ERROR, 1, "strdup failed"); +- } ++ entry->path = xstrdup(path); + if ((entry->size >= 1 << CRAMFS_SIZE_WIDTH)) { + warn_size = 1; + entry->size = (1 << CRAMFS_SIZE_WIDTH) - 1; + } + } + } else if (S_ISLNK(st.st_mode)) { +- entry->uncompressed = malloc(entry->size); ++ entry->uncompressed = xreadlink(path); + if (!entry->uncompressed) { +- die(MKFS_ERROR, 1, "malloc failed"); +- } +- if (readlink(path, entry->uncompressed, entry->size) < 0) { + warn_skip = 1; + continue; + } +@@ -351,7 +483,7 @@ + if (entry->size & -(1<name); ++ error_msg_and_die("bogus file type: %s", entry->name); + } + + if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { +@@ -378,7 +510,9 @@ + struct cramfs_super *super = (struct cramfs_super *) base; + unsigned int offset = sizeof(struct cramfs_super) + image_length; + +- offset += opt_pad; /* 0 if no padding */ ++ if (opt_pad) { ++ offset += opt_pad; /* 0 if no padding */ ++ } + + super->magic = CRAMFS_MAGIC; + super->flags = CRAMFS_FLAG_FSID_VERSION_2 | CRAMFS_FLAG_SORTED_DIRS; +@@ -414,10 +548,10 @@ + struct cramfs_inode *inode = (struct cramfs_inode *) (base + entry->dir_offset); + + if ((offset & 3) != 0) { +- die(MKFS_ERROR, 0, "illegal offset of %lu bytes", offset); ++ error_msg_and_die("illegal offset of %lu bytes", offset); + } + if (offset >= (1 << (2 + CRAMFS_OFFSET_WIDTH))) { +- die(MKFS_ERROR, 0, "filesystem too big"); ++ error_msg_and_die("filesystem too big"); + } + inode->offset = (offset >> 2); + } +@@ -429,7 +563,7 @@ + */ + static void print_node(struct entry *e) + { +- char info[10]; ++ char info[12]; + char type = '?'; + + if (S_ISREG(e->mode)) type = 'f'; +@@ -442,11 +576,11 @@ + + if (S_ISCHR(e->mode) || (S_ISBLK(e->mode))) { + /* major/minor numbers can be as high as 2^12 or 4096 */ +- snprintf(info, 10, "%4d,%4d", major(e->size), minor(e->size)); ++ snprintf(info, 11, "%4d,%4d", major(e->size), minor(e->size)); + } + else { + /* size be as high as 2^24 or 16777216 */ +- snprintf(info, 10, "%9d", e->size); ++ snprintf(info, 11, "%9d", e->size); + } + + printf("%c %04o %s %5d:%-3d %s\n", +@@ -462,17 +596,9 @@ + { + int stack_entries = 0; + int stack_size = 64; +- struct entry **entry_stack; +- +- entry_stack = malloc(stack_size * sizeof(struct entry *)); +- if (!entry_stack) { +- die(MKFS_ERROR, 1, "malloc failed"); +- } +- +- if (opt_verbose) { +- printf("root:\n"); +- } ++ struct entry **entry_stack = NULL; + ++ entry_stack = xmalloc(stack_size * sizeof(struct entry *)); + for (;;) { + int dir_start = stack_entries; + while (entry) { +@@ -506,10 +632,7 @@ + if (entry->child) { + if (stack_entries >= stack_size) { + stack_size *= 2; +- entry_stack = realloc(entry_stack, stack_size * sizeof(struct entry *)); +- if (!entry_stack) { +- die(MKFS_ERROR, 1, "realloc failed"); +- } ++ entry_stack = xrealloc(entry_stack, stack_size * sizeof(struct entry *)); + } + entry_stack[stack_entries] = entry; + stack_entries++; +@@ -543,7 +666,7 @@ + + set_data_offset(entry, base, offset); + if (opt_verbose) { +- printf("%s:\n", entry->name); ++ printf("'%s':\n", entry->name); + } + entry = entry->child; + } +@@ -553,16 +676,21 @@ + + static int is_zero(char const *begin, unsigned len) + { +- /* Returns non-zero iff the first LEN bytes from BEGIN are all NULs. */ +- return (len-- == 0 || +- (begin[0] == '\0' && +- (len-- == 0 || +- (begin[1] == '\0' && +- (len-- == 0 || +- (begin[2] == '\0' && +- (len-- == 0 || +- (begin[3] == '\0' && +- memcmp(begin, begin + 4, len) == 0)))))))); ++ if (opt_holes) ++ /* Returns non-zero iff the first LEN bytes from BEGIN are ++ all NULs. */ ++ return (len-- == 0 || ++ (begin[0] == '\0' && ++ (len-- == 0 || ++ (begin[1] == '\0' && ++ (len-- == 0 || ++ (begin[2] == '\0' && ++ (len-- == 0 || ++ (begin[3] == '\0' && ++ memcmp(begin, begin + 4, len) == 0)))))))); ++ else ++ /* Never create holes. */ ++ return 0; + } + + /* +@@ -575,37 +703,34 @@ + * Note that size > 0, as a zero-sized file wouldn't ever + * have gotten here in the first place. + */ +-static unsigned int do_compress(char *base, unsigned int offset, char const *name, char *uncompressed, unsigned int size) ++static unsigned int do_compress(char *base, unsigned int offset, struct entry *entry) + { ++ unsigned int size = entry->size; + unsigned long original_size = size; + unsigned long original_offset = offset; + unsigned long new_size; + unsigned long blocks = (size - 1) / blksize + 1; + unsigned long curr = offset + 4 * blocks; + int change; ++ char *uncompressed = entry->uncompressed; + +- total_blocks += blocks; ++ total_blocks += blocks; + + do { + unsigned long len = 2 * blksize; + unsigned int input = size; +- int err; +- + if (input > blksize) + input = blksize; + size -= input; +- if (!(opt_holes && is_zero (uncompressed, input))) { +- err = compress2(base + curr, &len, uncompressed, input, Z_BEST_COMPRESSION); +- if (err != Z_OK) { +- die(MKFS_ERROR, 0, "compression error: %s", zError(err)); +- } ++ if (!is_zero (uncompressed, input)) { ++ compress(base + curr, &len, uncompressed, input); + curr += len; + } + uncompressed += input; + + if (len > blksize*2) { + /* (I don't think this can happen with zlib.) */ +- die(MKFS_ERROR, 0, "AIEEE: block \"compressed\" to > 2*blocklength (%ld)", len); ++ error_msg_and_die("AIEEE: block \"compressed\" to > 2*blocklength (%ld)\n", len); + } + + *(u32 *) (base + offset) = curr; +@@ -618,10 +743,12 @@ + st_blocks * 512. But if you say that then perhaps + administrative data should also be included in both. */ + change = new_size - original_size; +- if (opt_verbose > 1) { +- printf("%6.2f%% (%+d bytes)\t%s\n", +- (change * 100) / (double) original_size, change, name); ++#if 0 ++ if (opt_verbose) { ++ printf("%6.2f%% (%+d bytes)\t%s\n", ++ (change * 100) / (double) original_size, change, entry->name); + } ++#endif + + return curr; + } +@@ -644,7 +771,7 @@ + set_data_offset(entry, base, offset); + entry->offset = offset; + map_entry(entry); +- offset = do_compress(base, offset, entry->name, entry->uncompressed, entry->size); ++ offset = do_compress(base, offset, entry); + unmap_entry(entry); + } + } +@@ -660,13 +787,10 @@ + int fd; + char *buf; + +- fd = open(file, O_RDONLY); +- if (fd < 0) { +- die(MKFS_ERROR, 1, "open failed: %s", file); +- } ++ fd = xopen(file, O_RDONLY, 0); + buf = mmap(NULL, image_length, PROT_READ, MAP_PRIVATE, fd, 0); + if (buf == MAP_FAILED) { +- die(MKFS_ERROR, 1, "mmap failed"); ++ error_msg_and_die("mmap failed"); + } + memcpy(base + offset, buf, image_length); + munmap(buf, image_length); +@@ -679,6 +803,328 @@ + return (offset + image_length); + } + ++static struct entry *find_filesystem_entry(struct entry *dir, char *name, mode_t type) ++{ ++ struct entry *e = dir; ++ ++ if (S_ISDIR(dir->mode)) { ++ e = dir->child; ++ } ++ while (e) { ++ /* Only bother to do the expensive strcmp on matching file types */ ++ if (type == (e->mode & S_IFMT) && e->name) { ++ if (S_ISDIR(e->mode)) { ++ int len = strlen(e->name); ++ ++ /* Check if we are a parent of the correct path */ ++ if (strncmp(e->name, name, len) == 0) { ++ /* Is this an _exact_ match? */ ++ if (strcmp(name, e->name) == 0) { ++ return (e); ++ } ++ /* Looks like we found a parent of the correct path */ ++ if (name[len] == '/') { ++ if (e->child) { ++ return (find_filesystem_entry (e, name + len + 1, type)); ++ } else { ++ return NULL; ++ } ++ } ++ } ++ } else { ++ if (strcmp(name, e->name) == 0) { ++ return (e); ++ } ++ } ++ } ++ e = e->next; ++ } ++ return (NULL); ++} ++ ++void modify_entry(char *full_path, unsigned long uid, unsigned long gid, ++ unsigned long mode, unsigned long rdev, struct entry *root, loff_t *fslen_ub) ++{ ++ char *name, *path, *full; ++ struct entry *curr, *parent, *entry, *prev; ++ ++ full = xstrdup(full_path); ++ path = xstrdup(dirname(full)); ++ name = full_path + strlen(path) + 1; ++ free(full); ++ if (strcmp(path, "/") == 0) { ++ parent = root; ++ name = full_path + 1; ++ } else { ++ if (!(parent = find_filesystem_entry(root, path+1, S_IFDIR))) ++ error_msg_and_die("%s/%s: could not find parent\n", path, name); ++ } ++ if ((entry = find_filesystem_entry(parent, name, (mode & S_IFMT)))) { ++ /* its there, just modify permissions */ ++ entry->mode = mode; ++ entry->uid = uid; ++ entry->gid = gid; ++ } else { /* make a new entry */ ++ ++ /* code partially replicated from parse_directory() */ ++ size_t namelen; ++ if (S_ISREG(mode)) { ++ error_msg_and_die("%s: regular file from device_table file must exist on disk!", full_path); ++ } ++ ++ namelen = strlen(name); ++ if (namelen > MAX_INPUT_NAMELEN) { ++ error_msg_and_die( ++ "Very long (%u bytes) filename `%s' found.\n" ++ " Please increase MAX_INPUT_NAMELEN in mkcramfs.c and recompile. Exiting.\n", ++ namelen, name); ++ } ++ entry = xcalloc(1, sizeof(struct entry)); ++ entry->name = xstrdup(name); ++ /* truncate multi-byte UTF-8 filenames on character boundary */ ++ if (namelen > CRAMFS_MAXPATHLEN) { ++ namelen = CRAMFS_MAXPATHLEN; ++ warn_namelen = 1; ++ /* the first lost byte must not be a trail byte */ ++ while ((entry->name[namelen] & 0xc0) == 0x80) { ++ namelen--; ++ /* are we reasonably certain it was UTF-8 ? */ ++ if (entry->name[namelen] < 0x80 || !namelen) { ++ error_msg_and_die("cannot truncate filenames not encoded in UTF-8"); ++ } ++ } ++ entry->name[namelen] = '\0'; ++ } ++ entry->mode = mode; ++ entry->uid = uid; ++ entry->gid = gid; ++ entry->size = 0; ++ if (S_ISBLK(mode) || S_ISCHR(mode)) { ++ entry->size = rdev; ++ if (entry->size & -(1<size += sizeof(struct cramfs_inode) + ((namelen + 3) & ~3); ++ ++ /* alright, time to link us in */ ++ curr = parent->child; ++ prev = NULL; ++ while (curr && strcmp(name, curr->name) > 0) { ++ prev = curr; ++ curr = curr->next; ++ } ++ if (!prev) parent->child = entry; ++ else prev->next = entry; ++ entry->next = curr; ++ entry->child = NULL; ++ } ++ if (entry->uid >= 1 << CRAMFS_UID_WIDTH) ++ warn_uid = 1; ++ if (entry->gid >= 1 << CRAMFS_GID_WIDTH) { ++ /* TODO: We ought to replace with a default ++ gid instead of truncating; otherwise there ++ are security problems. Maybe mode should ++ be &= ~070. Same goes for uid once Linux ++ supports >16-bit uids. */ ++ warn_gid = 1; ++ } ++ free(path); ++} ++ ++/* the GNU C library has a wonderful scanf("%as", string) which will ++ allocate the string with the right size, good to avoid buffer overruns. ++ the following macros use it if available or use a hacky workaround... ++ */ ++ ++#ifdef __GNUC__ ++#define SCANF_PREFIX "a" ++#define SCANF_STRING(s) (&s) ++#define GETCWD_SIZE 0 ++#else ++#define SCANF_PREFIX "511" ++#define SCANF_STRING(s) (s = xmalloc(512)) ++#define GETCWD_SIZE -1 ++inline int snprintf(char *str, size_t n, const char *fmt, ...) ++{ ++ int ret; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ ret = vsprintf(str, fmt, ap); ++ va_end(ap); ++ return ret; ++} ++#endif ++ ++/* device table entries take the form of: ++ ++ /dev/mem c 640 0 0 1 1 0 0 - ++ ++ type can be one of: ++ f A regular file ++ d Directory ++ c Character special device file ++ b Block special device file ++ p Fifo (named pipe) ++ ++ I don't bother with symlinks (permissions are irrelevant), hard ++ links (special cases of regular files), or sockets (why bother). ++ ++ Regular files must exist in the target root directory. If a char, ++ block, fifo, or directory does not exist, it will be created. ++*/ ++ ++static int interpret_table_entry(char *line, struct entry *root, loff_t *fslen_ub) ++{ ++ char type, *name = NULL; ++ unsigned long mode = 0755, uid = 0, gid = 0, major = 0, minor = 0; ++ unsigned long start = 0, increment = 1, count = 0; ++ ++ if (sscanf (line, "%" SCANF_PREFIX "s %c %lo %lu %lu %lu %lu %lu %lu %lu", ++ SCANF_STRING(name), &type, &mode, &uid, &gid, &major, &minor, ++ &start, &increment, &count) < 0) ++ { ++ return 1; ++ } ++ ++ if (!strcmp(name, "/")) { ++ error_msg_and_die("Device table entries require absolute paths"); ++ } ++ ++ switch (type) { ++ case 'd': ++ mode |= S_IFDIR; ++ modify_entry(name, uid, gid, mode, 0, root, fslen_ub); ++ break; ++ case 'f': ++ mode |= S_IFREG; ++ modify_entry(name, uid, gid, mode, 0, root, fslen_ub); ++ break; ++ case 'p': ++ mode |= S_IFIFO; ++ modify_entry(name, uid, gid, mode, 0, root, fslen_ub); ++ break; ++ case 'c': ++ case 'b': ++ mode |= (type == 'c') ? S_IFCHR : S_IFBLK; ++ if (count > 0) { ++ char *buf; ++ unsigned long i; ++ dev_t rdev; ++ ++ for (i = start; i < count; i++) { ++ asprintf(&buf, "%s%lu", name, i); ++ rdev = makedev(major, minor + (i * increment - start)); ++ modify_entry(buf, uid, gid, mode, rdev, root, fslen_ub); ++ free(buf); ++ } ++ } else { ++ dev_t rdev = makedev(major, minor); ++ modify_entry(name, uid, gid, mode, rdev, root, fslen_ub); ++ } ++ break; ++ default: ++ error_msg_and_die("Unsupported file type"); ++ } ++ free(name); ++ return 0; ++} ++ ++static int parse_device_table(FILE *file, struct entry *root, loff_t *fslen_ub) ++{ ++ char *line; ++ int status = 0; ++ size_t length = 0; ++ ++ /* Turn off squash, since we must ensure that values ++ * entered via the device table are not squashed */ ++ opt_squash = 0; ++ ++ /* Looks ok so far. The general plan now is to read in one ++ * line at a time, check for leading comment delimiters ('#'), ++ * then try and parse the line as a device table. If we fail ++ * to parse things, try and help the poor fool to fix their ++ * device table with a useful error msg... */ ++ line = NULL; ++ while (getline(&line, &length, file) != -1) { ++ /* First trim off any whitespace */ ++ int len = strlen(line); ++ ++ /* trim trailing whitespace */ ++ while (len > 0 && isspace(line[len - 1])) ++ line[--len] = '\0'; ++ /* trim leading whitespace */ ++ memmove(line, &line[strspn(line, " \n\r\t\v")], len); ++ ++ /* How long are we after trimming? */ ++ len = strlen(line); ++ ++ /* If this is NOT a comment line, try to interpret it */ ++ if (len && *line != '#') { ++ if (interpret_table_entry(line, root, fslen_ub)) ++ status = 1; ++ } ++ ++ free(line); ++ line = NULL; ++ } ++ free(line); ++ fclose(file); ++ ++ return status; ++} ++ ++void traverse(struct entry *entry, int depth) ++{ ++ struct entry *curr = entry; ++ int i; ++ ++ while (curr) { ++ for (i = 0; i < depth; i++) putchar(' '); ++ printf("%s: size=%d mode=%d same=%p\n", ++ (curr->name)? (char*)curr->name : "/", ++ curr->size, curr->mode, curr->same); ++ if (curr->child) traverse(curr->child, depth + 4); ++ curr = curr->next; ++ } ++} ++ ++static void free_filesystem_entry(struct entry *dir) ++{ ++ struct entry *e = dir, *last; ++ ++ if (S_ISDIR(dir->mode)) { ++ e = dir->child; ++ } ++ while (e) { ++ if (e->name) ++ free(e->name); ++ if (e->path) ++ free(e->path); ++ if (e->uncompressed) ++ free(e->uncompressed); ++ last = e; ++ if (e->child) { ++ free_filesystem_entry(e); ++ } ++ e = e->next; ++ free(last); ++ } ++} ++ ++ ++/* ++ * Usage: ++ * ++ * mkcramfs directory-name outfile ++ * ++ * where "directory-name" is simply the root of the directory ++ * tree that we want to generate a compressed filesystem out ++ * of. ++ */ + int main(int argc, char **argv) + { + struct stat st; /* used twice... */ +@@ -692,6 +1138,7 @@ + u32 crc; + int c; /* for getopt */ + char *ep; /* for strtoul */ ++ FILE *devtable = NULL; + + total_blocks = 0; + +@@ -699,7 +1146,7 @@ + progname = argv[0]; + + /* command line options */ +- while ((c = getopt(argc, argv, "hEe:i:n:psvz")) != EOF) { ++ while ((c = getopt(argc, argv, "hEe:i:n:psvzD:q")) != EOF) { + switch (c) { + case 'h': + usage(MKFS_OK); +@@ -715,7 +1162,7 @@ + case 'i': + opt_image = optarg; + if (lstat(opt_image, &st) < 0) { +- die(MKFS_ERROR, 1, "lstat failed: %s", opt_image); ++ error_msg_and_die("lstat failed: %s", opt_image); + } + image_length = st.st_size; /* may be padded later */ + fslen_ub += (image_length + 3); /* 3 is for padding */ +@@ -736,6 +1183,16 @@ + case 'z': + opt_holes = 1; + break; ++ case 'q': ++ opt_squash = 1; ++ break; ++ case 'D': ++ devtable = xfopen(optarg, "r"); ++ if (fstat(fileno(devtable), &st) < 0) ++ perror_msg_and_die(optarg); ++ if (st.st_size < 10) ++ error_msg_and_die("%s: not a proper device table file\n", optarg); ++ break; + } + } + +@@ -745,25 +1202,23 @@ + outfile = argv[optind + 1]; + + if (stat(dirname, &st) < 0) { +- die(MKFS_USAGE, 1, "stat failed: %s", dirname); +- } +- fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666); +- if (fd < 0) { +- die(MKFS_USAGE, 1, "open failed: %s", outfile); ++ error_msg_and_die("stat failed: %s", dirname); + } ++ fd = xopen(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666); + +- root_entry = calloc(1, sizeof(struct entry)); +- if (!root_entry) { +- die(MKFS_ERROR, 1, "calloc failed"); +- } ++ root_entry = xcalloc(1, sizeof(struct entry)); + root_entry->mode = st.st_mode; + root_entry->uid = st.st_uid; + root_entry->gid = st.st_gid; + + root_entry->size = parse_directory(root_entry, dirname, &root_entry->child, &fslen_ub); + ++ if (devtable) { ++ parse_device_table(devtable, root_entry, &fslen_ub); ++ } ++ + /* always allocate a multiple of blksize bytes because that's +- what we're going to write later on */ ++ what we're going to write later on */ + fslen_ub = ((fslen_ub - 1) | (blksize - 1)) + 1; + + if (fslen_ub > MAXFSLEN) { +@@ -790,7 +1245,7 @@ + rom_image = mmap(NULL, fslen_ub?fslen_ub:1, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (rom_image == MAP_FAILED) { +- die(MKFS_ERROR, 1, "mmap failed"); ++ error_msg_and_die("mmap failed"); + } + + /* Skip the first opt_pad bytes for boot loader code */ +@@ -807,6 +1262,7 @@ + } + + offset = write_directory_structure(root_entry->child, rom_image, offset); ++ if (opt_verbose) + printf("Directory data: %d bytes\n", offset); + + offset = write_data(root_entry, rom_image, offset); +@@ -814,30 +1270,38 @@ + /* We always write a multiple of blksize bytes, so that + losetup works. */ + offset = ((offset - 1) | (blksize - 1)) + 1; ++ if (opt_verbose) + printf("Everything: %d kilobytes\n", offset >> 10); + + /* Write the superblock now that we can fill in all of the fields. */ + write_superblock(root_entry, rom_image+opt_pad, offset); ++ if (opt_verbose) + printf("Super block: %d bytes\n", sizeof(struct cramfs_super)); + + /* Put the checksum in. */ + crc = crc32(0L, Z_NULL, 0); + crc = crc32(crc, (rom_image+opt_pad), (offset-opt_pad)); + ((struct cramfs_super *) (rom_image+opt_pad))->fsid.crc = crc; ++ if (opt_verbose) + printf("CRC: %x\n", crc); + + /* Check to make sure we allocated enough space. */ + if (fslen_ub < offset) { +- die(MKFS_ERROR, 0, "not enough space allocated for ROM image (%Ld allocated, %d used)", fslen_ub, offset); ++ error_msg_and_die("not enough space allocated for ROM " ++ "image (%Ld allocated, %d used)", fslen_ub, offset); + } + + written = write(fd, rom_image, offset); + if (written < 0) { +- die(MKFS_ERROR, 1, "write failed"); ++ error_msg_and_die("write failed"); + } + if (offset != written) { +- die(MKFS_ERROR, 0, "ROM image write failed (wrote %d of %d bytes)", written, offset); ++ error_msg_and_die("ROM image write failed (wrote %d of %d bytes)", written, offset); + } ++ ++ /* Free up memory */ ++ free_filesystem_entry(root_entry); ++ free(root_entry); + + /* (These warnings used to come at the start, but they scroll off the + screen too quickly.) */ diff --git a/obsolete-buildroot/sources/device_table.txt b/obsolete-buildroot/sources/device_table.txt new file mode 100644 index 0000000000..75d8068354 --- /dev/null +++ b/obsolete-buildroot/sources/device_table.txt @@ -0,0 +1,163 @@ +# When building a target filesystem, it is desirable to not have to +# become root and then run 'mknod' a thousand times. Using a device +# table you can create device nodes and directories "on the fly". +# +# This is a sample device table file for use with genext2fs. You can +# do all sorts of interesting things with a device table file. For +# example, if you want to adjust the permissions on a particular file +# you can just add an entry like: +# /sbin/foobar f 2755 0 0 - - - - - +# and (assuming the file /sbin/foobar exists) it will be made setuid +# root (regardless of what its permissions are on the host filesystem. +# Furthermore, you can use a single table entry to create a many device +# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] +# I could just use the following two table entries: +# /dev/hda b 640 0 0 3 0 0 0 - +# /dev/hda b 640 0 0 3 1 1 1 15 +# +# Device table entries take the form of: +# +# where name is the file name, type can be one of: +# f A regular file +# d Directory +# c Character special device file +# b Block special device file +# p Fifo (named pipe) +# uid is the user id for the target file, gid is the group id for the +# target file. The rest of the entries (major, minor, etc) apply only +# to device special files. + +# Have fun +# -Erik Andersen +# + +# +/dev d 755 0 0 - - - - - +/dev d 755 0 0 - - - - - +/dev/pts d 755 0 0 - - - - - +/tmp d 1777 0 0 - - - - - +/etc d 755 0 0 - - - - - +/home/default d 2755 1000 1000 - - - - - +/etc/network/if-up.d d 755 0 0 - - - - - +/etc/network/if-pre-up.d d 755 0 0 - - - - - +/etc/network/if-down.d d 755 0 0 - - - - - +/etc/network/if-post-down.d d 755 0 0 - - - - - +# Adjust permissions on some normal files +/etc/shadow f 600 0 0 - - - - - +/etc/passwd f 644 0 0 - - - - - +/bin/busybox f 4755 0 0 - - - - - +# uncomment this to allow starting x as non-root +#/usr/X11R6/bin/Xfbdev f 4755 0 0 - - - - - + +# Normal system devices +/dev/mem c 640 0 0 1 1 0 0 - +/dev/kmem c 640 0 0 1 2 0 0 - +/dev/null c 666 0 0 1 3 0 0 - +/dev/zero c 666 0 0 1 5 0 0 - +/dev/random c 666 0 0 1 8 0 0 - +/dev/urandom c 666 0 0 1 9 0 0 - +/dev/ram b 640 0 0 1 1 0 0 - +/dev/ram b 640 0 0 1 0 0 1 4 +/dev/loop b 640 0 0 7 0 0 1 2 +/dev/rtc c 640 0 0 10 135 - - - +/dev/console c 666 0 0 5 1 - - - +/dev/tty c 666 0 0 5 0 - - - +/dev/tty c 666 0 0 4 0 0 1 8 +/dev/ttyp c 666 0 0 3 0 0 1 10 +/dev/ptyp c 666 0 0 2 0 0 1 10 +/dev/ptmx c 666 0 0 5 2 - - - +/dev/ttyP c 666 0 0 57 0 0 1 4 +/dev/ttyS c 666 0 0 4 64 0 1 4 +/dev/fb c 640 0 5 29 0 0 32 4 +#/dev/ttySA c 666 0 0 204 5 0 1 3 +/dev/psaux c 666 0 0 10 1 0 0 - +#/dev/ppp c 666 0 0 108 0 - - - + +# MTD stuff +/dev/mtd c 640 0 0 90 0 0 2 4 +/dev/mtdblock b 640 0 0 31 0 0 1 4 + +#Tun/tap driver +/dev/net d 755 0 0 - - - - - +/dev/net/tun c 660 0 0 10 200 - - - + +# Audio stuff +#/dev/audio c 666 0 29 14 4 - - - +#/dev/audio1 c 666 0 29 14 20 - - - +#/dev/dsp c 666 0 29 14 3 - - - +#/dev/dsp1 c 666 0 29 14 19 - - - +#/dev/sndstat c 666 0 29 14 6 - - - + +# User-mode Linux stuff +/dev/ubda b 640 0 0 98 0 0 0 - +/dev/ubda b 640 0 0 98 1 1 1 15 + +# IDE Devices +/dev/hda b 640 0 0 3 0 0 0 - +/dev/hda b 640 0 0 3 1 1 1 15 +/dev/hdb b 640 0 0 3 64 0 0 - +/dev/hdb b 640 0 0 3 65 1 1 15 +#/dev/hdc b 640 0 0 22 0 0 0 - +#/dev/hdc b 640 0 0 22 1 1 1 15 +#/dev/hdd b 640 0 0 22 64 0 0 - +#/dev/hdd b 640 0 0 22 65 1 1 15 +#/dev/hde b 640 0 0 33 0 0 0 - +#/dev/hde b 640 0 0 33 1 1 1 15 +#/dev/hdf b 640 0 0 33 64 0 0 - +#/dev/hdf b 640 0 0 33 65 1 1 15 +#/dev/hdg b 640 0 0 34 0 0 0 - +#/dev/hdg b 640 0 0 34 1 1 1 15 +#/dev/hdh b 640 0 0 34 64 0 0 - +#/dev/hdh b 640 0 0 34 65 1 1 15 + +# SCSI Devices +#/dev/sda b 640 0 0 8 0 0 0 - +#/dev/sda b 640 0 0 8 1 1 1 15 +#/dev/sdb b 640 0 0 8 16 0 0 - +#/dev/sdb b 640 0 0 8 17 1 1 15 +#/dev/sdc b 640 0 0 8 32 0 0 - +#/dev/sdc b 640 0 0 8 33 1 1 15 +#/dev/sdd b 640 0 0 8 48 0 0 - +#/dev/sdd b 640 0 0 8 49 1 1 15 +#/dev/sde b 640 0 0 8 64 0 0 - +#/dev/sde b 640 0 0 8 65 1 1 15 +#/dev/sdf b 640 0 0 8 80 0 0 - +#/dev/sdf b 640 0 0 8 81 1 1 15 +#/dev/sdg b 640 0 0 8 96 0 0 - +#/dev/sdg b 640 0 0 8 97 1 1 15 +#/dev/sdh b 640 0 0 8 112 0 0 - +#/dev/sdh b 640 0 0 8 113 1 1 15 +#/dev/sg c 640 0 0 21 0 0 1 15 +#/dev/scd b 640 0 0 11 0 0 1 15 +#/dev/st c 640 0 0 9 0 0 1 8 +#/dev/nst c 640 0 0 9 128 0 1 8 +#/dev/st c 640 0 0 9 32 1 1 4 +#/dev/st c 640 0 0 9 64 1 1 4 +#/dev/st c 640 0 0 9 96 1 1 4 + +# Floppy disk devices +#/dev/fd b 640 0 0 2 0 0 1 2 +#/dev/fd0d360 b 640 0 0 2 4 0 0 - +#/dev/fd1d360 b 640 0 0 2 5 0 0 - +#/dev/fd0h1200 b 640 0 0 2 8 0 0 - +#/dev/fd1h1200 b 640 0 0 2 9 0 0 - +#/dev/fd0u1440 b 640 0 0 2 28 0 0 - +#/dev/fd1u1440 b 640 0 0 2 29 0 0 - +#/dev/fd0u2880 b 640 0 0 2 32 0 0 - +#/dev/fd1u2880 b 640 0 0 2 33 0 0 - + +# All the proprietary cdrom devices in the world +#/dev/aztcd b 640 0 0 29 0 0 0 - +#/dev/bpcd b 640 0 0 41 0 0 0 - +#/dev/capi20 c 640 0 0 68 0 0 1 2 +#/dev/cdu31a b 640 0 0 15 0 0 0 - +#/dev/cdu535 b 640 0 0 24 0 0 0 - +#/dev/cm206cd b 640 0 0 32 0 0 0 - +#/dev/sjcd b 640 0 0 18 0 0 0 - +#/dev/sonycd b 640 0 0 15 0 0 0 - +#/dev/gscd b 640 0 0 16 0 0 0 - +#/dev/sbpcd b 640 0 0 25 0 0 0 - +#/dev/sbpcd b 640 0 0 25 0 0 1 4 +#/dev/mcd b 640 0 0 23 0 0 0 - +#/dev/optcd b 640 0 0 17 0 0 0 - + diff --git a/obsolete-buildroot/sources/dnsmasq1-100-bugfix.patch b/obsolete-buildroot/sources/dnsmasq1-100-bugfix.patch new file mode 100644 index 0000000000..c676a1a398 --- /dev/null +++ b/obsolete-buildroot/sources/dnsmasq1-100-bugfix.patch @@ -0,0 +1,25 @@ +--- dnsmasq-1.18/config.h.dist 2004-03-01 22:25:12.000000000 -0600 ++++ dnsmasq-1.18/config.h 2004-03-01 22:26:50.000000000 -0600 +@@ -126,7 +126,9 @@ + + /* Must preceed __linux__ since uClinux defines __linux__ too. */ + #if defined(__uClinux__) || defined(__UCLIBC__) ++#ifndef __UCLIBC_HAS_IPV6__ + #undef HAVE_LINUX_IPV6_PROC ++#endif + #define HAVE_GETOPT_LONG + #undef HAVE_ARC4RANDOM + #define HAVE_RANDOM +diff -x CVS -urN dnsmasq-1.18/option.c dnsmasq.old/option.c +--- dnsmasq-1.18/option.c 2003-11-05 08:22:18.000000000 -0600 ++++ dnsmasq.old/option.c 2004-01-05 23:40:11.000000000 -0600 +@@ -578,8 +578,8 @@ + #ifdef HAVE_IPV6 + else if (tmp->source_addr.sa.sa_family == AF_INET6) + tmp->source_addr.in6.sin6_port = htons(*query_port); +- } + #endif ++ } + } + + if (*if_addrs) diff --git a/obsolete-buildroot/sources/dnsmasq1-openwrt.patch b/obsolete-buildroot/sources/dnsmasq1-openwrt.patch new file mode 100644 index 0000000000..e1741a28a2 --- /dev/null +++ b/obsolete-buildroot/sources/dnsmasq1-openwrt.patch @@ -0,0 +1,219 @@ +diff -x CVS -urN dnsmasq-1.18/dhcp.c dnsmasq.old/dhcp.c +--- dnsmasq-1.18/dhcp.c 2003-11-05 08:30:20.000000000 -0600 ++++ dnsmasq.old/dhcp.c 2004-01-05 23:40:11.000000000 -0600 +@@ -15,14 +15,20 @@ + + #include "dnsmasq.h" + +-static int next_token (char *token, int buffsize, FILE * fp); ++struct dhcpOfferedAddr { ++ u_int8_t hostname[16]; ++ u_int8_t chaddr[16]; ++ u_int32_t yiaddr; /* network order */ ++ u_int32_t expires; /* host order */ ++}; + + void load_dhcp(char *file, char *suffix, time_t now, char *hostname) + { +- char token[MAXTOK], *dot; ++ char *dot; + struct all_addr host_address; +- time_t ttd, tts; ++ time_t ttd; + FILE *fp = fopen (file, "r"); ++ struct dhcpOfferedAddr lease; + + if (!fp) + { +@@ -34,154 +40,45 @@ + + /* remove all existing DHCP cache entries */ + cache_unhash_dhcp(); +- +- while ((next_token(token, MAXTOK, fp))) +- { +- if (strcmp(token, "lease") == 0) +- { +- hostname[0] = '\0'; +- ttd = tts = (time_t)(-1); +-#ifdef HAVE_IPV6 +- if (next_token(token, MAXTOK, fp) && +- inet_pton(AF_INET, token, &host_address)) +-#else +- if (next_token(token, MAXTOK, fp) && +- (host_address.addr4.s_addr = inet_addr(token)) != (in_addr_t) -1) +-#endif +- { +- if (next_token(token, MAXTOK, fp) && *token == '{') +- { +- while (next_token(token, MAXTOK, fp) && *token != '}') ++ ++ while (fread(&lease, sizeof(lease), 1, fp)) { ++ host_address.addr.addr4.s_addr = lease.yiaddr; ++ ++ strcpy(hostname,lease.hostname); ++ if (lease.expires>(unsigned)now) ++ ttd = lease.expires; ++ else ++ ttd = -1; ++ dot = strchr(hostname, '.'); ++ if (suffix) + { +- if ((strcmp(token, "client-hostname") == 0) || +- (strcmp(token, "hostname") == 0)) +- { +- if (next_token(hostname, MAXDNAME, fp)) +- if (!canonicalise(hostname)) +- { +- *hostname = 0; +- syslog(LOG_ERR, "bad name in %s", file); +- } +- } +- else if ((strcmp(token, "ends") == 0) || +- (strcmp(token, "starts") == 0)) +- { +- struct tm lease_time; +- int is_ends = (strcmp(token, "ends") == 0); +- if (next_token(token, MAXTOK, fp) && /* skip weekday */ +- next_token(token, MAXTOK, fp) && /* Get date from lease file */ +- sscanf (token, "%d/%d/%d", +- &lease_time.tm_year, +- &lease_time.tm_mon, +- &lease_time.tm_mday) == 3 && +- next_token(token, MAXTOK, fp) && +- sscanf (token, "%d:%d:%d:", +- &lease_time.tm_hour, +- &lease_time.tm_min, +- &lease_time.tm_sec) == 3) +- { +- /* There doesn't seem to be a universally available library function +- which converts broken-down _GMT_ time to seconds-in-epoch. +- The following was borrowed from ISC dhcpd sources, where +- it is noted that it might not be entirely accurate for odd seconds. +- Since we're trying to get the same answer as dhcpd, that's just +- fine here. */ +- static int months [11] = { 31, 59, 90, 120, 151, 181, +- 212, 243, 273, 304, 334 }; +- time_t time = ((((((365 * (lease_time.tm_year - 1970) + /* Days in years since '70 */ +- (lease_time.tm_year - 1969) / 4 + /* Leap days since '70 */ +- (lease_time.tm_mon > 1 /* Days in months this year */ +- ? months [lease_time.tm_mon - 2] +- : 0) + +- (lease_time.tm_mon > 2 && /* Leap day this year */ +- !((lease_time.tm_year - 1972) & 3)) + +- lease_time.tm_mday - 1) * 24) + /* Day of month */ +- lease_time.tm_hour) * 60) + +- lease_time.tm_min) * 60) + lease_time.tm_sec; +- if (is_ends) +- ttd = time; +- else +- tts = time; } ++ if (dot) ++ { /* suffix and lease has ending: must match */ ++ if (strcmp(dot+1, suffix) != 0) ++ syslog(LOG_WARNING, ++ "Ignoring DHCP lease for %s because it has an illegal domain part", hostname); ++ else ++ cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE); + } +- } +- +- /* missing info? */ +- if (!*hostname) +- continue; +- if (ttd == (time_t)(-1)) +- continue; +- +- /* infinite lease to is represented by -1 */ +- /* This makes is to the lease file as +- start time one less than end time. */ +- /* We use -1 as infinite in ttd */ +- if ((tts != -1) && (ttd == tts - 1)) +- ttd = (time_t)(-1); +- else if (ttd < now) +- continue; +- +- dot = strchr(hostname, '.'); +- if (suffix) +- { +- if (dot) +- { /* suffix and lease has ending: must match */ +- if (strcmp(dot+1, suffix) != 0) +- syslog(LOG_WARNING, +- "Ignoring DHCP lease for %s because it has an illegal domain part", hostname); +- else +- cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE); +- } +- else +- { /* suffix exists but lease has no ending - add lease and lease.suffix */ +- cache_add_dhcp_entry(hostname, &host_address, ttd, 0); +- strncat(hostname, ".", MAXDNAME); +- strncat(hostname, suffix, MAXDNAME); +- hostname[MAXDNAME-1] = 0; /* in case strncat hit limit */ +- /* Make FQDN canonical for reverse lookups */ +- cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE); +- } +- } +- else +- { /* no suffix */ +- if (dot) /* no lease ending allowed */ +- syslog(LOG_WARNING, +- "Ignoring DHCP lease for %s because it has a domain part", hostname); +- else +- cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE); +- } +- } +- } +- } +- } ++ else ++ { /* suffix exists but lease has no ending - add lease and lease.suffix */ ++ cache_add_dhcp_entry(hostname, &host_address, ttd, 0); ++ strncat(hostname, ".", MAXDNAME); ++ strncat(hostname, suffix, MAXDNAME); ++ hostname[MAXDNAME-1] = 0; /* in case strncat hit limit */ ++ /* Make FQDN canonical for reverse lookups */ ++ cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE); ++ } ++ } ++ else ++ { /* no suffix */ ++ if (dot) /* no lease ending allowed */ ++ syslog(LOG_WARNING, ++ "Ignoring DHCP lease for %s because it has a domain part", hostname); ++ else ++ cache_add_dhcp_entry(hostname, &host_address, ttd, F_REVERSE); ++ } ++ } + fclose(fp); + + } +- +-static int next_token (char *token, int buffsize, FILE * fp) +-{ +- int c, count = 0; +- char *cp = token; +- +- while((c = getc(fp)) != EOF) +- { +- if (c == '#') +- do { c = getc(fp); } while (c != '\n' && c != EOF); +- +- if (c == ' ' || c == '\t' || c == '\n' || c == ';') +- { +- if (count) +- break; +- } +- else if ((c != '"') && (count> $@ + + magic.mgc: magic +- $(top_builddir)/src/file -C -m magic ++ /usr/bin/file -C -m magic + + magic.mime.mgc: magic.mime +- $(top_builddir)/src/file -C -m magic.mime ++ /usr/bin/file -C -m magic.mime + + magic_FRAGMENTS = \ + Magdir/acorn \ +--- file-4.04/magic/Makefile.in.orig 2003-10-02 13:52:23.000000000 -0600 ++++ file-4.04/magic/Makefile.in 2003-10-02 13:52:53.000000000 -0600 +@@ -477,10 +477,10 @@ + done >> $@ + + magic.mgc: magic +- $(top_builddir)/src/file -C -m magic ++ /usr/bin/file -C -m magic + + magic.mime.mgc: magic.mime +- $(top_builddir)/src/file -C -m magic.mime ++ /usr/bin/file -C -m magic.mime + # 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: diff --git a/obsolete-buildroot/sources/gcc-uclibc-3.3-100-conf.patch b/obsolete-buildroot/sources/gcc-uclibc-3.3-100-conf.patch new file mode 100644 index 0000000000..213b4fbbd6 --- /dev/null +++ b/obsolete-buildroot/sources/gcc-uclibc-3.3-100-conf.patch @@ -0,0 +1,1593 @@ +diff -urN gcc-3.3.3/boehm-gc/config.sub gcc-3.3.3-new/boehm-gc/config.sub +--- gcc-3.3.3/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3-new/boehm-gc/config.sub 2004-02-16 21:12:16.000000000 -0600 +@@ -118,7 +118,7 @@ + # 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* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3/config.sub gcc-3.3.3-new/config.sub +--- gcc-3.3.3/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3-new/config.sub 2004-02-16 21:12:16.000000000 -0600 +@@ -118,7 +118,7 @@ + # 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* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3/gcc/config/arm/linux-elf.h gcc-3.3.3-new/gcc/config/arm/linux-elf.h +--- gcc-3.3.3/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3-new/gcc/config/arm/linux-elf.h 2004-02-16 21:12:16.000000000 -0600 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3/gcc/config/cris/linux.h gcc-3.3.3-new/gcc/config/cris/linux.h +--- gcc-3.3.3/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/cris/linux.h 2004-02-16 21:12:16.000000000 -0600 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3/gcc/config/cris/t-linux-uclibc gcc-3.3.3-new/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/cris/t-linux-uclibc 2004-02-16 21:12:16.000000000 -0600 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3/gcc/config/i386/linux.h gcc-3.3.3-new/gcc/config/i386/linux.h +--- gcc-3.3.3/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/i386/linux.h 2004-02-16 21:12:16.000000000 -0600 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3/gcc/config/mips/linux.h gcc-3.3.3-new/gcc/config/mips/linux.h +--- gcc-3.3.3/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/mips/linux.h 2004-02-16 21:12:16.000000000 -0600 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3/gcc/config/sh/linux.h gcc-3.3.3-new/gcc/config/sh/linux.h +--- gcc-3.3.3/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/sh/linux.h 2004-02-16 21:12:16.000000000 -0600 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3/gcc/config/sh/t-linux-uclibc gcc-3.3.3-new/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/sh/t-linux-uclibc 2004-02-16 21:12:16.000000000 -0600 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3/gcc/config/sh/t-sh64-uclibc gcc-3.3.3-new/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/sh/t-sh64-uclibc 2004-02-16 21:12:16.000000000 -0600 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3/gcc/config/t-linux-uclibc gcc-3.3.3-new/gcc/config/t-linux-uclibc +--- gcc-3.3.3/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/t-linux-uclibc 2004-02-16 21:12:16.000000000 -0600 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3/gcc/config.gcc gcc-3.3.3-new/gcc/config.gcc +--- gcc-3.3.3/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config.gcc 2004-02-16 21:12:16.000000000 -0600 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3/libstdc++-v3/aclocal.m4 gcc-3.3.3-new/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3-new/libstdc++-v3/aclocal.m4 2004-02-16 21:12:16.000000000 -0600 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3/libstdc++-v3/configure gcc-3.3.3-new/libstdc++-v3/configure +--- gcc-3.3.3/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3-new/libstdc++-v3/configure 2004-02-17 00:21:12.000000000 -0600 +@@ -2996,6 +2996,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4279,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext < ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext < ++ #include ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext < ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3/libstdc++-v3/configure.in gcc-3.3.3-new/libstdc++-v3/configure.in +--- gcc-3.3.3/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3-new/libstdc++-v3/configure.in 2004-02-16 23:13:45.000000000 -0600 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3/libstdc++-v3/configure.target gcc-3.3.3-new/libstdc++-v3/configure.target +--- gcc-3.3.3/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3-new/libstdc++-v3/configure.target 2004-02-16 21:12:16.000000000 -0600 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3-new/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3-new/libstdc++-v3/include/c_std/std_cstdlib.h 2004-02-16 21:12:16.000000000 -0600 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3-new/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3-new/libstdc++-v3/include/c_std/std_cwchar.h 2004-02-16 21:12:16.000000000 -0600 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3/ltconfig gcc-3.3.3-new/ltconfig +--- gcc-3.3.3/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3-new/ltconfig 2004-02-16 21:12:16.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/obsolete-buildroot/sources/gcc-uclibc-3.3-110-conf.patch b/obsolete-buildroot/sources/gcc-uclibc-3.3-110-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/obsolete-buildroot/sources/gcc-uclibc-3.3-110-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/obsolete-buildroot/sources/gcc-uclibc-3.3-120-softfloat.patch b/obsolete-buildroot/sources/gcc-uclibc-3.3-120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/obsolete-buildroot/sources/gcc-uclibc-3.3-120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/obsolete-buildroot/sources/gcc-uclibc-3.3-200-code.patch b/obsolete-buildroot/sources/gcc-uclibc-3.3-200-code.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/obsolete-buildroot/sources/gcc-uclibc-3.3-200-code.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek ++ ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include ++#include // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use . ++ ++// Written by Benjamin Kosnik ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__int_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast(__ext_bom); ++ char_traits::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast(__from); ++ __cfrom = reinterpret_cast(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast(__cfrom); ++ __to_next = reinterpret_cast(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname::ctype_byname(const char* __s, size_t __refs) ++ : ctype(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype::__wmask_type ++ ctype::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast(__c)); ++ } ++ ++ const wchar_t* ++ ctype:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#define _LIBC ++#include ++#undef _LIBC ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik ++ ++#include ++#include ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik ++ ++ template ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast(__c)] & __m; } ++ ++ const char* ++ ctype:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype::do_toupper(char __c) const ++ { return _M_toupper[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype::do_tolower(char __c) const ++ { return _M_tolower[static_cast(__c)]; } ++ ++ const char* ++ ctype::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 library 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 library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/obsolete-buildroot/sources/gcc-uclibc-3.3-loop.patch b/obsolete-buildroot/sources/gcc-uclibc-3.3-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/obsolete-buildroot/sources/gcc-uclibc-3.3-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/obsolete-buildroot/sources/gcc2.95-mega.patch.bz2 b/obsolete-buildroot/sources/gcc2.95-mega.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4dffd849b6f04932803a1bab09990953c6691399 GIT binary patch literal 125297 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 t&-jAej)~hul(~0_hoQIS3 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

tK?hXX=R4dcNM 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

)YUsTDeRW~>ei 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/dev/null; then diff --git a/obsolete-buildroot/sources/gcc3.3-mega.patch.bz2 b/obsolete-buildroot/sources/gcc3.3-mega.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..adfda5f1a222fcb9a75d6dae33a18265d6e26eb1 GIT binary patch literal 153371 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 z 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 WQ`BAAn*FE$#oUoj6eI%FF^PZ;IG^wU literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/gdb-5.3-uclibc.patch b/obsolete-buildroot/sources/gdb-5.3-uclibc.patch new file mode 100644 index 0000000000..f9853035e3 --- /dev/null +++ b/obsolete-buildroot/sources/gdb-5.3-uclibc.patch @@ -0,0 +1,154 @@ +diff -urN gdb-5.3/bfd/config.bfd gdb-5.3-new/bfd/config.bfd +--- gdb-5.3/bfd/config.bfd 2002-09-05 15:34:35.000000000 -0500 ++++ gdb-5.3-new/bfd/config.bfd 2004-01-11 06:25:31.000000000 -0600 +@@ -83,7 +83,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -97,7 +97,8 @@ + targ_defvec=bfd_elf64_ia64_aix_little_vec + targ_selvecs="bfd_elf64_ia64_aix_big_vec bfd_efi_app_ia64_vec" + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf*) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | \ ++ ia64*-*-linux-uclibc* | ia64*-*-elf*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -176,11 +177,12 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux*) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux*) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -313,7 +315,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -324,7 +326,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -424,7 +426,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3456]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -438,7 +440,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -589,7 +591,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -865,7 +867,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -887,8 +890,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcqnx_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1038,7 +1041,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1081,7 +1084,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN gdb-5.3/bfd/configure gdb-5.3-new/bfd/configure +--- gdb-5.3/bfd/configure 2002-08-28 05:38:44.000000000 -0500 ++++ gdb-5.3-new/bfd/configure 2004-01-11 06:27:15.000000000 -0600 +@@ -1677,6 +1677,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5067,7 +5072,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5126,7 +5131,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3456]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; diff --git a/obsolete-buildroot/sources/gdb.patch b/obsolete-buildroot/sources/gdb.patch new file mode 100644 index 0000000000..e44b15ccdf --- /dev/null +++ b/obsolete-buildroot/sources/gdb.patch @@ -0,0 +1,633 @@ +Patch pending upstream, probably acceptable. +-------------------------------------------- + + + +Daniel Jacobowitz writes: +> I like this. The way func_frame_chain_valid should really be used is +> by something like: +> +> /* NOTE: tm-i386nw.h and tm-i386v4.h override this. */ +> set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); +> +> (copied from i386-tdep.c). +> +> Does this patch work for you? + +Yes, thanks. I've included a revised version of my patch below. + +> I'm curious as to why we can't just set this universally, or at least a +> little more globally. Most things that have a main () use it as a +> normal main (). I'd propose that we set it as the default frame chain, +> and provide/document an option to ignore inside_main_func. + +Well, gdbarch is never supposed to change the default behavior of +macros; this helps us convert pre-gdbarch targets incrementally. +Simply turning on gdbarch for one's target ideally wouldn't change its +behavior at all. + + +[Patch revised for Debian snapshot] +--- snap/gdb/i386-linux-tdep.c.orig 2002-08-18 19:53:57.000000000 -0400 ++++ snap/gdb/i386-linux-tdep.c 2002-08-18 19:54:31.000000000 -0400 +@@ -452,6 +452,9 @@ + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + i386_linux_svr4_fetch_link_map_offsets); ++ ++ set_gdbarch_frame_chain_valid (gdbarch, ++ generic_func_frame_chain_valid); + } + + /* Provide a prototype to silence -Wmissing-prototypes. */ +[Hurd needs 6. Take 8, since it does no real harm.] + + +Package: gdb +Severity: normal +Tags: patch, sid + +Hello, + +GDB will crash on the Hurd after issuing the 'show' and hitting enter +a few times: + +../../gdb/ui-out.c:130: gdb-internal-error: push_level: Assertion +`uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS' failed. + +the problem is that MAX_UI_OUT_LEVELS is not high enough for the extra +option we have on the Hurd, it should be rised to 6 then, which works +fine: + +--- gdb-5.2.cvs20020401/gdb/ui-out.c~ Fri May 3 02:19:20 2002 ++++ gdb-5.2.cvs20020401/gdb/ui-out.c Fri May 3 02:19:32 2002 +@@ -45,7 +45,7 @@ + is always available. Stack/nested level 0 is reserved for the + top-level result. */ + +-enum { MAX_UI_OUT_LEVELS = 5 }; ++enum { MAX_UI_OUT_LEVELS = 8 }; + + struct ui_out_level + { + +-- +Robert Millan + +"5 years from now everyone will be running +free GNU on their 200 MIPS, 64M SPARCstation-5" + + Andrew S. Tanenbaum, 30 Jan 1992 + + +Submitted upstream, not liked very much. It's a hack, but it will do for +now. + +2002-07-31 Daniel Jacobowitz + + Fix PR gdb/568 + * thread-db.c (lwp_from_thread): Only warn if unable to find + the thread. + +Index: thread-db.c +=================================================================== +RCS file: /cvs/src/src/gdb/thread-db.c,v +retrieving revision 1.22 +diff -u -p -r1.22 thread-db.c +--- gdb/gdb/thread-db.c 23 Mar 2002 17:38:13 -0000 1.22 ++++ gdb/gdb/thread-db.c 31 Jul 2002 16:29:52 -0000 +@@ -260,6 +260,12 @@ lwp_from_thread (ptid_t ptid) + return ptid; + + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th); ++ if (err == TD_ERR) ++ { ++ warning ("Cannot find thread %ld: %s", ++ (long) GET_THREAD (ptid), thread_db_err_str (err)); ++ return ptid; ++ } + if (err != TD_OK) + error ("Cannot find thread %ld: %s", + (long) GET_THREAD (ptid), thread_db_err_str (err)); +From Michael Fedrowitz . Not submitted to FSF yet. + + Hi, + +gdb fails to build from source on m68k because some definitions have +been removed from tm-m68k.h. The patch below readds them. + +-Michael + + +diff -urN gdb-5.2.cvs20020818.orig/gdb/config/m68k/tm-m68k.h gdb-5.2.cvs20020818/gdb/config/m68k/tm-m68k.h +--- gdb-5.2.cvs20020818.orig/gdb/config/m68k/tm-m68k.h 2002-07-10 19:01:38.000000000 +0200 ++++ gdb-5.2.cvs20020818/gdb/config/m68k/tm-m68k.h 2002-10-06 18:01:59.000000000 +0200 +@@ -26,8 +26,11 @@ + /* Generic 68000 stuff, to be included by other tm-*.h files. */ + + /* D0_REGNM and A0_REGNUM must be defined here because they are +- used by the monitor. */ ++ used by the monitor. FPC_REGNUM, FPS_REGNUM and FPI_REGNUM are ++ defined here because they are used by m68klinux-nat.c. */ + + #define D0_REGNUM 0 + #define A0_REGNUM 8 +- ++#define FPC_REGNUM 26 ++#define FPS_REGNUM 27 ++#define FPI_REGNUM 28 + + +2002-11-24 Daniel Jacobowitz + + * doublest.c (convert_floatformat_to_doublest): Cast exp_bias to int. + * config/alpha/alpha-linux.mh (MH_CFLAGS): Add -mieee. + +--- gdb-5.2.debian90.cvs20021120/gdb/doublest.c.orig 2002-11-24 17:48:16.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/doublest.c 2002-11-24 17:48:25.000000000 -0500 +@@ -177,7 +177,7 @@ + if (!special_exponent) + exponent -= fmt->exp_bias; + else if (exponent == 0) +- exponent = 1 - fmt->exp_bias; ++ exponent = 1 - (int)fmt->exp_bias; + + /* Build the result algebraically. Might go infinite, underflow, etc; + who cares. */ +--- gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh.orig 2002-11-24 17:50:30.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh 2002-11-24 17:50:41.000000000 -0500 +@@ -8,3 +8,5 @@ + + MMALLOC = + MMALLOC_CFLAGS = -DNO_MMALLOC ++ ++MH_CFLAGS = -mieee +In CVS but not in 5.3 branch... + +2002-10-23 Daniel Jacobowitz + + * lin-lwp.c (lin_lwp_resume): Remove resume_all test for !step. + +Index: lin-lwp.c +=================================================================== +RCS file: /cvs/src/src/gdb/lin-lwp.c,v +retrieving revision 1.35 +diff -u -p -r1.35 lin-lwp.c +--- gdb-5.2.90/gdb/lin-lwp.c 27 Aug 2002 22:37:06 -0000 1.35 ++++ gdb-5.2.90/gdb/lin-lwp.c 23 Oct 2002 04:23:13 -0000 +@@ -579,11 +579,8 @@ lin_lwp_resume (ptid_t ptid, int step, e + struct lwp_info *lp; + int resume_all; + +- /* Apparently the interpretation of PID is dependent on STEP: If +- STEP is non-zero, a specific PID means `step only this process +- id'. But if STEP is zero, then PID means `continue *all* +- processes, but give the signal only to this one'. */ +- resume_all = (PIDGET (ptid) == -1) || !step; ++ /* A specific PTID means `step only this process id'. */ ++ resume_all = (PIDGET (ptid) == -1); + + if (resume_all) + iterate_over_lwps (resume_set_callback, NULL); + +Not submitted yet, testing. + +--- gdb-5.2.90/gdb/alpha-tdep.c.orig Sun Nov 24 21:42:53 2002 ++++ gdb-5.2.90/gdb/alpha-tdep.c Sun Nov 24 21:48:26 2002 +@@ -99,10 +99,12 @@ + + static alpha_extra_func_info_t heuristic_proc_desc (CORE_ADDR, + CORE_ADDR, +- struct frame_info *); ++ struct frame_info *, ++ int); + + static alpha_extra_func_info_t find_proc_desc (CORE_ADDR, +- struct frame_info *); ++ struct frame_info *, ++ int); + + #if 0 + static int alpha_in_lenient_prologue (CORE_ADDR, CORE_ADDR); +@@ -512,7 +514,7 @@ + if (tmp != 0) + pc = tmp; + +- proc_desc = find_proc_desc (pc, frame->next); ++ proc_desc = find_proc_desc (pc, frame->next, 1); + pcreg = proc_desc ? PROC_PC_REG (proc_desc) : ALPHA_RA_REGNUM; + + if (frame->signal_handler_caller) +@@ -596,10 +598,10 @@ + + static alpha_extra_func_info_t + heuristic_proc_desc (CORE_ADDR start_pc, CORE_ADDR limit_pc, +- struct frame_info *next_frame) ++ struct frame_info *next_frame, int read_sp_p) + { +- CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM); +- CORE_ADDR vfp = sp; ++ CORE_ADDR sp; ++ CORE_ADDR vfp; + CORE_ADDR cur_pc; + int frame_size; + int has_frame_reg = 0; +@@ -607,6 +609,11 @@ + int pcreg = -1; + int regno; + ++ if (read_sp_p) ++ vfp = sp = read_next_frame_reg (next_frame, SP_REGNUM); ++ else ++ vfp = sp = 0; ++ + if (start_pc == 0) + return NULL; + memset (&temp_proc_desc, '\0', sizeof (temp_proc_desc)); +@@ -761,7 +768,7 @@ + CORE_ADDR func_addr, func_end; + + if (!proc_desc) +- proc_desc = find_proc_desc (pc, NULL); ++ proc_desc = find_proc_desc (pc, NULL, 0); + + if (proc_desc) + { +@@ -807,7 +814,7 @@ + } + + static alpha_extra_func_info_t +-find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame) ++find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int read_sp_p) + { + alpha_extra_func_info_t proc_desc; + struct block *b; +@@ -879,7 +886,7 @@ + { + alpha_extra_func_info_t found_heuristic = + heuristic_proc_desc (PROC_LOW_ADDR (proc_desc), +- pc, next_frame); ++ pc, next_frame, read_sp_p); + if (found_heuristic) + { + PROC_LOCALOFF (found_heuristic) = +@@ -921,7 +928,7 @@ + startaddr = heuristic_proc_start (pc); + + proc_desc = +- heuristic_proc_desc (startaddr, pc, next_frame); ++ heuristic_proc_desc (startaddr, pc, next_frame, read_sp_p); + } + return proc_desc; + } +@@ -937,7 +944,7 @@ + if (saved_pc == 0 || inside_entry_file (saved_pc)) + return 0; + +- proc_desc = find_proc_desc (saved_pc, frame); ++ proc_desc = find_proc_desc (saved_pc, frame, 1); + if (!proc_desc) + return 0; + +@@ -979,7 +986,7 @@ + { + /* Use proc_desc calculated in frame_chain */ + alpha_extra_func_info_t proc_desc = +- frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next); ++ frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next, 1); + + frame->extra_info = (struct frame_extra_info *) + frame_obstack_alloc (sizeof (struct frame_extra_info)); +@@ -1291,7 +1298,7 @@ + /* we need proc_desc to know how to restore the registers; + if it is NULL, construct (a temporary) one */ + if (proc_desc == NULL) +- proc_desc = find_proc_desc (frame->pc, frame->next); ++ proc_desc = find_proc_desc (frame->pc, frame->next, 1); + + /* Question: should we copy this proc_desc and save it in + frame->proc_desc? If we do, who will free it? +Not yet submitted upstream. This requires some serious thinking about. +If the target stack worked in any logical way, this wouldn't be necessary... +ending up with roughly: + thread_stratum: thread-db (silent reference to lin-lwp) + core_stratum: corelow + exec_stratum: exec + dummy_stratum: dummy +just makes no sense. + +This patch fixes debugging threaded applications which are statically linked +without breaking debugging threaded core files. It also fixes the PIDs in +generate-core-file'd corefiles. Mostly. + +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c gdb-5.2.debian90.cvs20021120/gdb/corelow.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-09-18 13:23:15.000000000 -0400 ++++ gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-12-03 14:03:32.000000000 -0500 +@@ -350,7 +350,7 @@ + bfd_map_over_sections (core_bfd, add_to_thread_list, + bfd_get_section_by_name (core_bfd, ".reg")); + +- if (ontop) ++ if (ontop || 1) + { + /* Fetch all registers from core file. */ + target_fetch_registers (-1); +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 14:13:52.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 13:56:34.000000000 -0500 +@@ -177,7 +177,7 @@ + #ifdef FILL_FPXREGSET + gdb_fpxregset_t fpxregs; + #endif +- unsigned long merged_pid = ptid_get_tid (ptid) << 16 | ptid_get_pid (ptid); ++ unsigned long merged_pid = ptid_get_tid (ptid) << 16; /* | ptid_get_pid (ptid); */ + + fill_gregset (&gregs, -1); + note_data = (char *) elfcore_write_prstatus (obfd, +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/target.c gdb-5.2.debian90.cvs20021120/gdb/target.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-09-18 13:23:22.000000000 -0400 ++++ gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-12-03 14:06:07.000000000 -0500 +@@ -1589,6 +1589,7 @@ + dummy_target.to_find_memory_regions = dummy_find_memory_regions; + dummy_target.to_make_corefile_notes = dummy_make_corefile_notes; + dummy_target.to_magic = OPS_MAGIC; ++ cleanup_target (&dummy_target); + } + + +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c gdb-5.2.debian90.cvs20021120/gdb/thread-db.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 14:13:50.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 13:39:54.000000000 -0500 +@@ -57,6 +57,31 @@ + /* Non-zero if we're using this module's target vector. */ + static int using_thread_db; + ++/* Macros to pass an event to the next target if we should not be handling it ++ here in the thread_stratum. */ ++#define FIND_NEXT_TARGET(METHOD_NAME) \ ++ struct target_ops *next_target = &thread_db_ops; \ ++ while (1) \ ++ { \ ++ next_target = find_target_beneath (next_target); \ ++ if (next_target->METHOD_NAME != NULL) \ ++ break; \ ++ } ++ ++#define MAYBE_HAND_DOWN(METHOD_NAME,ARGS) \ ++ if (proc_handle.pid == 0) \ ++ { \ ++ FIND_NEXT_TARGET (METHOD_NAME); \ ++ (*next_target->METHOD_NAME) ARGS; \ ++ return; \ ++ } ++#define MAYBE_HAND_DOWN_RETURN(METHOD_NAME,ARGS) \ ++ if (proc_handle.pid == 0) \ ++ { \ ++ FIND_NEXT_TARGET (METHOD_NAME); \ ++ return (*next_target->METHOD_NAME) ARGS; \ ++ } ++ + /* Non-zero if we have to keep this module's target vector active + across re-runs. */ + static int keep_thread_db; +@@ -489,9 +514,7 @@ + { + td_err_e err; + +- /* Don't attempt to use thread_db on targets which can not run +- (core files). */ +- if (objfile == NULL || !target_has_execution) ++ if (objfile == NULL) + { + /* All symbols have been discarded. If the thread_db target is + active, deactivate it now. */ +@@ -515,7 +538,10 @@ + /* Initialize the structure that identifies the child process. Note + that at this point there is no guarantee that we actually have a + child process. */ +- proc_handle.pid = GET_PID (inferior_ptid); ++ if (target_has_execution) ++ proc_handle.pid = GET_PID (inferior_ptid); ++ else ++ proc_handle.pid = 0; + + /* Now attempt to open a connection to the thread library. */ + err = td_ta_new_p (&proc_handle, &thread_agent); +@@ -758,6 +784,9 @@ + struct cleanup *old_chain = save_inferior_ptid (); + int xfer; + ++ MAYBE_HAND_DOWN_RETURN (to_xfer_memory, (memaddr, myaddr, len, write, ++ attrib, target)); ++ + if (is_thread (inferior_ptid)) + { + /* FIXME: This seems to be necessary to make sure breakpoints +@@ -782,6 +811,8 @@ + gdb_prfpregset_t fpregset; + td_err_e err; + ++ MAYBE_HAND_DOWN (to_fetch_registers, (regno)); ++ + if (!is_thread (inferior_ptid)) + { + /* Pass the request to the target beneath us. */ +@@ -819,6 +850,8 @@ + gdb_prfpregset_t fpregset; + td_err_e err; + ++ MAYBE_HAND_DOWN (to_store_registers, (regno)); ++ + if (!is_thread (inferior_ptid)) + { + /* Pass the request to the target beneath us. */ +@@ -908,6 +941,8 @@ + td_thrinfo_t ti; + td_err_e err; + ++ MAYBE_HAND_DOWN_RETURN (to_thread_alive, (ptid)); ++ + if (is_thread (ptid)) + { + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th); +@@ -961,6 +996,8 @@ + { + td_err_e err; + ++ MAYBE_HAND_DOWN (to_find_new_threads, ()); ++ + /* Iterate over all user-space threads to discover new threads. */ + err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL, + TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY, +@@ -972,6 +1009,8 @@ + static char * + thread_db_pid_to_str (ptid_t ptid) + { ++ MAYBE_HAND_DOWN_RETURN (to_pid_to_str, (ptid)); ++ + if (is_thread (ptid)) + { + static char buf[64]; +Trivial. Need to submit this. + +--- gdb-5.2.debian90.cvs20021120/gdb/tracepoint.c.orig 2002-12-03 14:35:44.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/tracepoint.c 2002-12-03 14:43:02.000000000 -0500 +@@ -861,6 +861,8 @@ + else + line = gdb_readline (0); + ++ if (line == NULL || *line == EOF) ++ break; + linetype = validate_actionline (&line, t); + if (linetype == BADLINE) + continue; /* already warned -- collect another line */ +Fix build on Sparc. + +--- gdb-5.3/gdb/sparc-nat.c.orig 2003-01-04 00:11:28.000000000 -0500 ++++ gdb-5.3/gdb/sparc-nat.c 2003-01-04 00:12:42.000000000 -0500 +@@ -33,6 +33,13 @@ + #include + #include + #ifdef __linux__ ++/* Sadly, conflicts with on Linux. And ++ -D_GNU_SOURCE brings in implicitly with . ++ Hack around this. */ ++#undef FPU_REGS_TYPE ++#define fpu asm_reg_fpu ++#define fq asm_reg_fq ++#define fpq asm_reg_fpq + #include + #else + #include +diff -urN gdb-5.3/gdb/gdbserver.orig/gdbreplay.c gdb-5.3/gdb/gdbserver/gdbreplay.c +--- gdb-5.3/gdb/gdbserver.orig/gdbreplay.c 2002-07-09 11:38:58.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/gdbreplay.c 2003-08-20 08:44:20.000000000 -0600 +@@ -54,14 +54,15 @@ + perror_with_name (char *string) + { + #ifndef STDC_HEADERS +- extern int sys_nerr; + extern char *sys_errlist[]; + extern int errno; + #endif + const char *err; + char *combined; + +- err = (errno < sys_nerr) ? sys_errlist[errno] : "unknown error"; ++ err = strerror (errno); ++ if (err == NULL) ++ err = "unknown error"; + combined = (char *) alloca (strlen (err) + strlen (string) + 3); + strcpy (combined, string); + strcat (combined, ": "); +diff -urN gdb-5.3/gdb/gdbserver.orig/low-hppabsd.c gdb-5.3/gdb/gdbserver/low-hppabsd.c +--- gdb-5.3/gdb/gdbserver.orig/low-hppabsd.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-hppabsd.c 2003-08-20 08:46:04.000000000 -0600 +@@ -61,7 +61,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-lynx.c gdb-5.3/gdb/gdbserver/low-lynx.c +--- gdb-5.3/gdb/gdbserver.orig/low-lynx.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-lynx.c 2003-08-20 08:46:18.000000000 -0600 +@@ -79,7 +79,7 @@ + + fprintf (stderr, "GDBserver (process %d): Cannot exec %s: %s.\n", + getpid (), program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-nbsd.c gdb-5.3/gdb/gdbserver/low-nbsd.c +--- gdb-5.3/gdb/gdbserver.orig/low-nbsd.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-nbsd.c 2003-08-20 08:46:27.000000000 -0600 +@@ -137,7 +137,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-sparc.c gdb-5.3/gdb/gdbserver/low-sparc.c +--- gdb-5.3/gdb/gdbserver.orig/low-sparc.c 2002-01-17 14:13:50.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-sparc.c 2003-08-20 08:46:38.000000000 -0600 +@@ -44,7 +44,6 @@ + #include + #include + +-extern int sys_nerr; + extern char **sys_errlist; + extern int errno; + +@@ -67,7 +66,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-sun3.c gdb-5.3/gdb/gdbserver/low-sun3.c +--- gdb-5.3/gdb/gdbserver.orig/low-sun3.c 2002-01-17 14:13:50.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-sun3.c 2003-08-20 08:46:51.000000000 -0600 +@@ -41,7 +41,6 @@ + #include + #include + +-extern int sys_nerr; + extern char **sys_errlist; + extern int errno; + +@@ -64,7 +63,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/utils.c gdb-5.3/gdb/gdbserver/utils.c +--- gdb-5.3/gdb/gdbserver.orig/utils.c 2003-08-20 08:47:56.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/utils.c 2003-08-20 08:48:15.000000000 -0600 +@@ -33,16 +33,13 @@ + perror_with_name (char *string) + { + #ifndef STDC_HEADERS +- extern int sys_nerr; +- extern char *sys_errlist[]; + extern int errno; + #endif + const char *err; + char *combined; + +- if (errno < sys_nerr) +- err = sys_errlist[errno]; +- else ++ err = strerror (errno); ++ if (err == NULL) + err = "unknown error"; + + combined = (char *) alloca (strlen (err) + strlen (string) + 3); +diff -urN gdb-5.3/gdb/gdbserver.orig/linux-low.c.orig gdb-5.3/gdb/gdbserver/linux-low.c.orig +--- gdb-5.3/gdb/gdbserver.orig/linux-low.c 2003-08-20 08:40:27.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/linux-low.c 2003-08-20 08:44:54.000000000 -0600 +@@ -175,8 +175,7 @@ + if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0) + { + fprintf (stderr, "Cannot attach to process %d: %s (%d)\n", pid, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error", +- errno); ++ strerror (errno), errno); + fflush (stderr); + + /* If we fail to attach to an LWP, just return. */ + diff --git a/obsolete-buildroot/sources/genext2fs.patch b/obsolete-buildroot/sources/genext2fs.patch new file mode 100644 index 0000000000..73e5ce0aaa --- /dev/null +++ b/obsolete-buildroot/sources/genext2fs.patch @@ -0,0 +1,2457 @@ +diff -urN genext2fs-1.3.orig/Makefile genext2fs-1.3/Makefile +--- genext2fs-1.3.orig/Makefile 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/Makefile 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,46 @@ ++CC=gcc ++CFLAGS=-Wall -O0 -g ++ ++SRC=genext2fs.c ++OBJS=$(patsubst %.c,%.o, $(SRC)) ++ ++all: genext2fs ++INSTALL=install ++ ++genext2fs: $(OBJS) ++ $(CC) $(CFLAGS) -o $@ $(OBJS) -o $@ ++ ++$(OBJS): %.o : %.c ++ $(CC) $(CFLAGS) -c $< -o $@ ++ ++$(OBJS): Makefile ++ ++install: ++ $(INSTALL) -d $(DESTDIR)/usr/bin/ ++ $(INSTALL) -m 755 genext2fs $(DESTDIR)/usr/bin/ ++ $(INSTALL) -d $(DESTDIR)/usr/share/man/man8/ ++ $(INSTALL) -m 644 genext2fs.8 $(DESTDIR)/usr/share/man/man8/ ++ ++clean: ++ rm -rf *.o *.a core genext2fs ++ rm -rf test ext2.img ++ ++check: all ++ mkdir -p test ++ dd if=/dev/zero of=test/zero count=1 ++ ./genext2fs -b 4096 -d test ext2.img ++ ++ md5=`md5sum ext2.img | cut -f 1 -d " "`; \ ++ if [ "$$md5" != "89471302d95f96a76fbb2cff98182cde" ] ; then \ ++ echo "test failed."; \ ++ else \ ++ echo "test succeeded."; \ ++ fi ++ ++# test genext2fs by creating the image and comparing checksums ++test: all ++ sh ./test.sh ++ ++# test genext2fs by actually mounting the created image. ++test-mount: all ++ sudo sh ./test-mount.sh +diff -urN genext2fs-1.3.orig/debian/changelog genext2fs-1.3/debian/changelog +--- genext2fs-1.3.orig/debian/changelog 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/debian/changelog 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,17 @@ ++genext2fs (1.3-2) unstable; urgency=low ++ ++ * apply fix from upstream cvs that appears to fix endian bug ++ (closes: #122411) ++ * mention filesystem size limit in manpage (closes: #122729) ++ * mention that hard links are not supported in manpage ++ (closes: #155464) ++ * add sanity check at the end of the build ++ ++ -- David Kimdon Fri, 8 Mar 2002 23:17:36 -0800 ++ ++genext2fs (1.3-1) unstable; urgency=low ++ ++ * Initial Release. (closes: #105263) ++ ++ -- David Kimdon Sat, 14 Jul 2001 13:24:49 -0700 ++ +diff -urN genext2fs-1.3.orig/debian/control genext2fs-1.3/debian/control +--- genext2fs-1.3.orig/debian/control 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/debian/control 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,19 @@ ++Source: genext2fs ++Section: admin ++Priority: optional ++Maintainer: David Kimdon ++Build-Depends: debhelper (>> 3.0.0) ++Standards-Version: 3.5.2 ++ ++Package: genext2fs ++Architecture: any ++Depends: ${shlibs:Depends} ++Description: ext2 filesystem generator for embedded systems ++ `genext2fs' is meant to generate an ext2 filesystem ++ as a normal (non-root) user. It doesn't require you to mount ++ the image file to copy files on it. It doesn't even require ++ you to be the superuser to make device nodes. ++ . ++ Warning ! `genext2fs' has been designed for embedded ++ systems. As such, it will generate a filesystem for single-user ++ usage: all files/directories/etc... will belong to UID/GID 0 +diff -urN genext2fs-1.3.orig/debian/copyright genext2fs-1.3/debian/copyright +--- genext2fs-1.3.orig/debian/copyright 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/debian/copyright 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,15 @@ ++This package was debianized by David Kimdon on ++Sat, 14 Jul 2001 13:24:49 -0700. ++ ++It was downloaded from http://freshmeat.net/projects/genext2fs/ ++Upstream Author(s): Xavier Bestel ++ ++Copyright (C) 2000 Xavier Bestel ++ ++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; version ++2 of the License. ++ ++On Debian systems, the complete text of the GNU General Public ++License can be found in /usr/share/common-licenses/GPL file. +diff -urN genext2fs-1.3.orig/debian/rules genext2fs-1.3/debian/rules +--- genext2fs-1.3.orig/debian/rules 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/debian/rules 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,70 @@ ++#!/usr/bin/make -f ++# Sample debian/rules that uses debhelper. ++# GNU copyright 1997 to 1999 by Joey Hess. ++ ++# Uncomment this to turn on verbose mode. ++#export DH_VERBOSE=1 ++ ++# This is the debhelper compatability version to use. ++export DH_COMPAT=2 ++ ++configure: configure-stamp ++configure-stamp: ++ dh_testdir ++ # Add here commands to configure the package. ++ # ./configure --prefix=/usr --mandir=/usr/share/man/ ++ ++ touch configure-stamp ++ ++build: configure-stamp build-stamp ++build-stamp: ++ dh_testdir ++ ++ # Add here commands to compile the package. ++ $(MAKE) ++ $(MAKE) check ++ ++ touch build-stamp ++ ++clean: ++ dh_testdir ++ dh_testroot ++ rm -f build-stamp configure-stamp ++ ++ # Add here commands to clean up after the build process. ++ -$(MAKE) clean ++ ++ dh_clean ++ ++install: build ++ dh_testdir ++ dh_testroot ++ dh_clean -k ++ dh_installdirs ++ ++ # Add here commands to install the package into debian/genext2fs. ++ $(MAKE) install DESTDIR=`pwd`/debian/genext2fs ++ ++ ++# Build architecture-independent files here. ++binary-indep: build install ++# We have nothing to do by default. ++ ++# Build architecture-dependent files here. ++binary-arch: build install ++ dh_testdir ++ dh_testroot ++ dh_installdocs ++ dh_installchangelogs ++ dh_link ++ dh_strip ++ dh_compress ++ dh_fixperms ++ dh_installdeb ++ dh_shlibdeps ++ dh_gencontrol ++ dh_md5sums ++ dh_builddeb ++ ++binary: binary-indep binary-arch ++.PHONY: build clean binary-indep binary-arch binary install configure +diff -urN genext2fs-1.3.orig/dev.txt genext2fs-1.3/dev.txt +--- genext2fs-1.3.orig/dev.txt 2000-09-28 09:03:19.000000000 -0600 ++++ genext2fs-1.3/dev.txt 1969-12-31 17:00:00.000000000 -0700 +@@ -1,94 +0,0 @@ +-drwx /dev +-crw- 10,190 /dev/lcd +-crw- 10,191 /dev/splc781 +-crw- 4,0 /dev/console +-crw- 5,64 /dev/cua0 +-crw- 5,65 /dev/cua1 +-crw- 5,66 /dev/cua2 +-crw- 5,70 /dev/cua6 +-crw- 5,71 /dev/cua7 +-crw- 5,72 /dev/cua8 +-crw- 5,73 /dev/cua9 +-crw- 29,0 /dev/fb0 +-crw- 29,32 /dev/fb1 +-crw- 1,2 /dev/kmem +-crw- 1,1 /dev/mem +-crw- 1,3 /dev/null +-crw- 2,2 /dev/ptyp2 +-crw- 2,3 /dev/ptyp3 +-crw- 2,5 /dev/ptyp5 +-crw- 2,4 /dev/ptyp4 +-crw- 10,178 /dev/triokb +-crw- 2,0 /dev/ptyp0 +-crw- 2,6 /dev/ptyp6 +-crw- 2,7 /dev/ptyp7 +-crw- 2,8 /dev/ptyp8 +-crw- 2,9 /dev/ptyp9 +-crw- 2,10 /dev/ptypa +-crw- 2,11 /dev/ptypb +-crw- 2,12 /dev/ptypc +-crw- 2,13 /dev/ptypd +-crw- 2,14 /dev/ptype +-crw- 2,15 /dev/ptypf +-brw- 1,0 /dev/ram0 +-brw- 1,1 /dev/ram1 +-brw- 1,2 /dev/ram2 +-brw- 1,3 /dev/ram3 +-br-- 31,0 /dev/rom0 +-brw- 31,1 /dev/rom1 +-brw- 31,2 /dev/rom2 +-brw- 31,3 /dev/rom3 +-crw- 5,0 /dev/tty +-crw- 4,0 /dev/tty0 +-crwx 4,1 /dev/tty1 +-crwx 4,2 /dev/tty2 +-crwx 4,3 /dev/tty3 +-crwx 4,4 /dev/tty4 +-crw- 4,5 /dev/tty5 +-crwx 4,6 /dev/tty6 +-crw- 4,7 /dev/tty7 +-crw- 4,8 /dev/tty8 +-crw- 4,9 /dev/tty9 +-crw- 4,64 /dev/ttyS0 +-crw- 4,65 /dev/ttyS1 +-crw- 4,66 /dev/ttyS2 +-crw- 4,67 /dev/ttyS3 +-crw- 4,68 /dev/ttyS4 +-crw- 4,69 /dev/ttyS5 +-crw- 4,70 /dev/ttyS6 +-crw- 4,71 /dev/ttyS7 +-crw- 4,72 /dev/ttyS8 +-crw- 4,73 /dev/ttyS9 +-crw- 3,0 /dev/ttyp0 +-crw- 3,1 /dev/ttyp1 +-crw- 3,2 /dev/ttyp2 +-crw- 3,3 /dev/ttyp3 +-crw- 3,4 /dev/ttyp4 +-crw- 3,5 /dev/ttyp5 +-crw- 3,6 /dev/ttyp6 +-crw- 3,7 /dev/ttyp7 +-crw- 3,8 /dev/ttyp8 +-crw- 3,9 /dev/ttyp9 +-crw- 3,10 /dev/ttypa +-crw- 3,11 /dev/ttypb +-crw- 3,12 /dev/ttypc +-crw- 3,13 /dev/ttypd +-crw- 3,14 /dev/ttype +-crw- 3,15 /dev/ttypf +-crw- 1,5 /dev/zero +-crwx 10,111 /dev/dtedrv +-crwx 4,110 /dev/ttyM +-crw- 77,1 /dev/tssnd +-crw- 77,2 /dev/tstone +-crw- 2,1 /dev/ptyp1 +-crwx 10,180 /dev/triohook +-crw- 90,0 /dev/mtd0 +-brw- 44,0 /dev/ftl0 +-crw- 10,175 /dev/tporta +-crw- 10,176 /dev/tportb +-crwx 10,100 /dev/softmodem +-crwx 10,101 /dev/softmodem_signals +-crwx 10,181 /dev/triovoice +-crw- 5,67 /dev/cua3 +-crw- 5,68 /dev/cua4 +-crw- 5,69 /dev/cua5 +diff -urN genext2fs-1.3.orig/device_table.txt genext2fs-1.3/device_table.txt +--- genext2fs-1.3.orig/device_table.txt 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/device_table.txt 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,129 @@ ++# When building a target filesystem, it is desirable to not have to ++# become root and then run 'mknod' a thousand times. Using a device ++# table you can create device nodes and directories "on the fly". ++# ++# This is a sample device table file for use with genext2fs. You can ++# do all sorts of interesting things with a device table file. For ++# example, if you want to adjust the permissions on a particular file ++# you can just add an entry like: ++# /sbin/foobar f 2755 0 0 - - - - - ++# and (assuming the file /sbin/foobar exists) it will be made setuid ++# root (regardless of what its permissions are on the host filesystem. ++# Furthermore, you can use a single table entry to create a many device ++# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] ++# I could just use the following two table entries: ++# /dev/hda b 640 0 0 3 0 0 0 - ++# /dev/hda b 640 0 0 3 1 1 1 15 ++# ++# Device table entries take the form of: ++# ++# where name is the file name, type can be one of: ++# f A regular file ++# d Directory ++# c Character special device file ++# b Block special device file ++# p Fifo (named pipe) ++# uid is the user id for the target file, gid is the group id for the ++# target file. The rest of the entries (major, minor, etc) apply only ++# to device special files. ++ ++# Have fun ++# -Erik Andersen ++# ++ ++# ++/dev d 755 0 0 - - - - - ++/dev/mem c 640 0 0 1 1 0 0 - ++/dev/kmem c 640 0 0 1 2 0 0 - ++/dev/null c 640 0 0 1 3 0 0 - ++/dev/zero c 640 0 0 1 5 0 0 - ++/dev/random c 640 0 0 1 8 0 0 - ++/dev/urandom c 640 0 0 1 9 0 0 - ++/dev/tty c 666 0 0 5 0 0 0 - ++/dev/tty c 666 0 0 4 0 0 1 6 ++/dev/console c 640 0 0 5 1 0 0 - ++/dev/ram b 640 0 0 1 1 0 0 - ++/dev/ram b 640 0 0 1 0 0 1 4 ++/dev/loop b 640 0 0 7 0 0 1 2 ++/dev/ptmx c 666 0 0 5 2 0 0 - ++#/dev/ttyS c 640 0 0 4 64 0 1 4 ++#/dev/psaux c 640 0 0 10 1 0 0 - ++#/dev/rtc c 640 0 0 10 135 0 0 - ++ ++# Adjust permissions on some normal files ++#/etc/shadow f 600 0 0 - - - - - ++#/bin/tinylogin f 4755 0 0 - - - - - ++ ++# User-mode Linux stuff ++/dev/ubda b 640 0 0 98 0 0 0 - ++/dev/ubda b 640 0 0 98 1 1 1 15 ++ ++# IDE Devices ++/dev/hda b 640 0 0 3 0 0 0 - ++/dev/hda b 640 0 0 3 1 1 1 15 ++/dev/hdb b 640 0 0 3 64 0 0 - ++/dev/hdb b 640 0 0 3 65 1 1 15 ++#/dev/hdc b 640 0 0 22 0 0 0 - ++#/dev/hdc b 640 0 0 22 1 1 1 15 ++#/dev/hdd b 640 0 0 22 64 0 0 - ++#/dev/hdd b 640 0 0 22 65 1 1 15 ++#/dev/hde b 640 0 0 33 0 0 0 - ++#/dev/hde b 640 0 0 33 1 1 1 15 ++#/dev/hdf b 640 0 0 33 64 0 0 - ++#/dev/hdf b 640 0 0 33 65 1 1 15 ++#/dev/hdg b 640 0 0 34 0 0 0 - ++#/dev/hdg b 640 0 0 34 1 1 1 15 ++#/dev/hdh b 640 0 0 34 64 0 0 - ++#/dev/hdh b 640 0 0 34 65 1 1 15 ++ ++# SCSI Devices ++#/dev/sda b 640 0 0 8 0 0 0 - ++#/dev/sda b 640 0 0 8 1 1 1 15 ++#/dev/sdb b 640 0 0 8 16 0 0 - ++#/dev/sdb b 640 0 0 8 17 1 1 15 ++#/dev/sdc b 640 0 0 8 32 0 0 - ++#/dev/sdc b 640 0 0 8 33 1 1 15 ++#/dev/sdd b 640 0 0 8 48 0 0 - ++#/dev/sdd b 640 0 0 8 49 1 1 15 ++#/dev/sde b 640 0 0 8 64 0 0 - ++#/dev/sde b 640 0 0 8 65 1 1 15 ++#/dev/sdf b 640 0 0 8 80 0 0 - ++#/dev/sdf b 640 0 0 8 81 1 1 15 ++#/dev/sdg b 640 0 0 8 96 0 0 - ++#/dev/sdg b 640 0 0 8 97 1 1 15 ++#/dev/sdh b 640 0 0 8 112 0 0 - ++#/dev/sdh b 640 0 0 8 113 1 1 15 ++#/dev/sg c 640 0 0 21 0 0 1 15 ++#/dev/scd b 640 0 0 11 0 0 1 15 ++#/dev/st c 640 0 0 9 0 0 1 8 ++#/dev/nst c 640 0 0 9 128 0 1 8 ++#/dev/st c 640 0 0 9 32 1 1 4 ++#/dev/st c 640 0 0 9 64 1 1 4 ++#/dev/st c 640 0 0 9 96 1 1 4 ++ ++# Floppy disk devices ++#/dev/fd b 640 0 0 2 0 0 1 2 ++#/dev/fd0d360 b 640 0 0 2 4 0 0 - ++#/dev/fd1d360 b 640 0 0 2 5 0 0 - ++#/dev/fd0h1200 b 640 0 0 2 8 0 0 - ++#/dev/fd1h1200 b 640 0 0 2 9 0 0 - ++#/dev/fd0u1440 b 640 0 0 2 28 0 0 - ++#/dev/fd1u1440 b 640 0 0 2 29 0 0 - ++#/dev/fd0u2880 b 640 0 0 2 32 0 0 - ++#/dev/fd1u2880 b 640 0 0 2 33 0 0 - ++ ++# All the proprietary cdrom devices in the world ++#/dev/aztcd b 640 0 0 29 0 0 0 - ++#/dev/bpcd b 640 0 0 41 0 0 0 - ++#/dev/capi20 c 640 0 0 68 0 0 1 2 ++#/dev/cdu31a b 640 0 0 15 0 0 0 - ++#/dev/cdu535 b 640 0 0 24 0 0 0 - ++#/dev/cm206cd b 640 0 0 32 0 0 0 - ++#/dev/sjcd b 640 0 0 18 0 0 0 - ++#/dev/sonycd b 640 0 0 15 0 0 0 - ++#/dev/gscd b 640 0 0 16 0 0 0 - ++#/dev/sbpcd b 640 0 0 25 0 0 0 - ++#/dev/sbpcd b 640 0 0 25 0 0 1 4 ++#/dev/mcd b 640 0 0 23 0 0 0 - ++#/dev/optcd b 640 0 0 17 0 0 0 - ++ +diff -urN genext2fs-1.3.orig/genext2fs.8 genext2fs-1.3/genext2fs.8 +--- genext2fs-1.3.orig/genext2fs.8 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/genext2fs.8 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,125 @@ ++.\" Hey, EMACS: -*- nroff -*- ++.\" First parameter, NAME, should be all caps ++.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection ++.\" other parameters are allowed: see man(7), man(1) ++.TH GENEXT2FS 8 "July 14, 2001" ++.\" Please adjust this date whenever revising the manpage. ++.\" ++.\" Some roff macros, for reference: ++.\" .nh disable hyphenation ++.\" .hy enable hyphenation ++.\" .ad l left justify ++.\" .ad b justify to both left and right margins ++.\" .nf disable filling ++.\" .fi enable filling ++.\" .br insert line break ++.\" .sp insert n+1 empty lines ++.\" for manpage-specific macros, see man(7) ++.SH NAME ++genext2fs \- ext2 filesystem generator for embedded systems ++.SH SYNOPSIS ++.B genext2fs ++.RI [ options ] " image" ++.SH DESCRIPTION ++\fBgenext2fs\fP generates an ext2 filesystem ++as a normal (non-root) user. It doesn't require you to mount ++the image file to copy files on it. It doesn't even require ++you to be the superuser to make device nodes. ++.SH OPTIONS ++.TP ++.BI -x \ image ++Use this image as a starting point ++.TP ++.BI -d \ directory ++Add this directory as source ++.TP ++.BI -f \ FILE ++.TP ++.BI -D \ FILE ++Uses the named FILE as a device table file, to create device ++nodes and directories "on the fly". ++.TP ++.BI -b \ blocks ++Size in blocks ++.TP ++.BI -i \ inodes ++Number of inodes ++.TP ++.BI -r \ reserved ++Number of reserved blocks ++.TP ++.BI -g \ path ++Generate a block map file for this path ++.TP ++.BI -e \ value ++Fill unallocated blocks with value ++.TP ++.BI -z ++Make files with holes ++.TP ++.BI -U ++Squash owners making all files be owned by root ++.TP ++.BI -P ++Squash permissions on all files ++.TP ++.BI -q ++Squash permissions and owners (same as -P -U) ++.TP ++.BI -v ++Print resulting filesystem structure ++.TP ++.BI -h ++Display help ++.TP ++.SH EXAMPLES ++ ++.EX ++.B ++ genext2fs -b 1440 -d src /dev/fd0 ++.EE ++ ++All files in the ++.I src ++directory will be written to ++.B /dev/fd0 ++as a new ext2 filesystem image. You can then mount the floppy as ++usual. ++ ++.EX ++.B ++ genext2fs -b 1024 -d src -D device_table.txt flashdisk.img ++.EE ++ ++This example builds a filesystem from all the files in ++.I src ++, then device nodes are created based on the content the device_table file ++.I dev.txt. ++An example device file follows: ++ ++.EX ++ # ++ /dev d 755 0 0 - - - - - ++ /dev/mem c 640 0 0 1 1 0 0 - ++ /dev/tty c 666 0 0 5 0 0 0 - ++ /dev/tty c 666 0 0 4 0 0 1 6 ++ /dev/loop b 640 0 0 7 0 0 1 2 ++ /dev/hda b 640 0 0 3 0 0 0 - ++ /dev/hda b 640 0 0 3 1 1 1 16 ++.EE ++ ++This device table creates the /dev directory, a character device ++node /dev/mem (major 1, minor 1), it also creates /dev/tty, ++/dev/tty[0-5], /dev/loop[0-1], /dev/hda, and /dev/hda0 to /dev/hda15 ++.SH BUGS ++\fBgenext2fs\fP does not support hard links. Hard links present in the input ++tree will be represented as separate files in the ext2 image. ++ ++.SH SEE ALSO ++.BR mkfs (8), ++.BR genromfs (8), ++.BR mkisofs (8). ++.br ++.SH AUTHOR ++This manual page was written by David Kimdon , ++for the Debian GNU/Linux system (but may be used by others). +diff -urN genext2fs-1.3.orig/genext2fs.c genext2fs-1.3/genext2fs.c +--- genext2fs-1.3.orig/genext2fs.c 2001-06-18 02:11:32.000000000 -0600 ++++ genext2fs-1.3/genext2fs.c 2003-04-21 01:48:35.000000000 -0600 +@@ -1,3 +1,4 @@ ++/* vi: set sw=8 ts=8: */ + // genext2fs.c + // + // ext2 filesystem generator for embedded systems +@@ -26,6 +27,22 @@ + // Bugfix: getcwd values for Solaris xavier.gueguen@col.bsf.alcatel.fr + // Bugfix: ANSI scanf for non-GNU C xavier.gueguen@col.bsf.alcatel.fr + // 28 Jun 2001 Bugfix: getcwd differs for Solaris/GNU mike@sowbug.com ++// 23 Mar 2002 Bugfix: test for IFCHR or IFBLK was flawed ++// 10 Oct 2002 Added comments,makefile targets, vsundar@ixiacom.com ++// endianess swap assert check. ++// Copyright (C) 2002 Ixia communications ++// 12 Oct 2002 Added support for triple indirection vsundar@ixiacom.com ++// Copyright (C) 2002 Ixia communications ++// 14 Oct 2002 Added support for groups vsundar@ixiacom.com ++// Copyright (C) 2002 Ixia communications ++// 5 Jan 2003 Bugfixes: reserved inodes should be set vsundar@usc.edu ++// only in the first group; directory names ++// need to be null padded at the end; and ++// number of blocks per group should be a ++// multiple of 8. Updated md5 values. ++// 6 Jan 2003 Erik Andersen added ++// mkfs.jffs2 compatible device table support, ++// along with -q, -P, -U + + + // `genext2fs' is a mean to generate an ext2 filesystem +@@ -33,10 +50,6 @@ + // the image file to copy files on it. It doesn't even require + // you to be the superuser to make device nodes. + // +-// Warning ! `genext2fs' has been designed for embedded +-// systems. As such, it will generate a filesystem for single-user +-// usage: all files/directories/etc... will belong to UID/GID 0 +-// + // Example usage: + // + // # genext2fs -b 1440 -d srcdir /dev/fd0 +@@ -45,21 +58,15 @@ + // a new ext2 filesystem image. You can then mount the floppy as + // usual. + // +-// # genext2fs -b 1024 -d builddir -f devices.txt flashdisk.img ++// # genext2fs -b 1024 -d builddir -D device_table.txt flashdisk.img + // + // This one would build a filesystem from all the files in builddir, +-// then would read a devices list and make apropriate nodes. The +-// format for the device list is: +-// +-// drwx /dev +-// crw- 10,190 /dev/lcd +-// brw- 1,0 /dev/ram0 +-// +-// This device list builds the /dev directory, a character device +-// node /dev/lcd (major 10, minor 190) and a block device node +-// /dev/ram0 (major 1, minor 0) ++// then would read the device_table.txt file and make apropriate nodes. ++// The format for the device table file is covered in detail in the sample ++// device_table.txt file provided with the genext2fs source. + + ++#define _GNU_SOURCE + #include + #include + #include +@@ -67,6 +74,11 @@ + #include + #include + #include ++#include ++#include ++#include ++#include ++#include + + + +@@ -76,10 +88,14 @@ + #define BLOCKSIZE 1024 + #define BLOCKS_PER_GROUP 8192 + #define BYTES_PER_INODE (8*BLOCKSIZE) ++/* Percentage of blocks that are reserved.*/ + #define RESERVED_INODES 5/100 + + + // inode block size (why is it != BLOCKSIZE ?!?) ++/* The field i_blocks in the ext2 inode stores the number of data blocks ++ but in terms of 512 bytes. That is what INODE_BLOCKSIZE represents. ++ INOBLK is the number of such blocks in an actual disk block */ + + #define INODE_BLOCKSIZE 512 + #define INOBLK (BLOCKSIZE / INODE_BLOCKSIZE) +@@ -147,6 +163,39 @@ + + #define OP_HOLES 0x01 // make files with holes + ++/* Defines for accessing group details */ ++ ++// Number of groups in the filesystem ++#define GRP_NBGROUPS(fs) ( ((fs)->sb.s_blocks_count-1)/(fs)->sb.s_blocks_per_group ) ++ ++// Get group block bitmap (bbm) given the group number ++#define GRP_GET_GROUP_BBM(fs,grp) ( get_blk((fs),(fs)->gd[(grp)].bg_block_bitmap) ) ++ ++// Get group inode bitmap (ibm) given the group number ++#define GRP_GET_GROUP_IBM(fs,grp) ( get_blk((fs),(fs)->gd[(grp)].bg_inode_bitmap) ) ++ ++// Given an inode number find the group it belongs to ++#define GRP_GROUP_OF_INODE(fs,nod) ( ((nod)-1) / (fs)->sb.s_inodes_per_group) ++ ++//Given an inode number get the inode bitmap that covers it ++#define GRP_GET_INODE_BITMAP(fs,nod) \ ++ ( GRP_GET_GROUP_IBM((fs),GRP_GROUP_OF_INODE((fs),(nod))) ) ++ ++//Given an inode number find its offset within the inode bitmap that covers it ++#define GRP_IBM_OFFSET(fs,nod) \ ++ ( (nod) - GRP_GROUP_OF_INODE((fs),(nod))*(fs)->sb.s_inodes_per_group ) ++ ++// Given a block number find the group it belongs to ++#define GRP_GROUP_OF_BLOCK(fs,blk) ( ((blk)-1) / (fs)->sb.s_blocks_per_group) ++ ++//Given a block number get the block bitmap that covers it ++#define GRP_GET_BLOCK_BITMAP(fs,blk) \ ++ ( GRP_GET_GROUP_BBM((fs),GRP_GROUP_OF_BLOCK((fs),(blk))) ) ++ ++//Given a block number find its offset within the block bitmap that covers it ++#define GRP_BBM_OFFSET(fs,blk) \ ++ ( (blk) - GRP_GROUP_OF_BLOCK((fs),(blk))*(fs)->sb.s_blocks_per_group ) ++ + + // used types + +@@ -287,7 +336,6 @@ + { + groupdescriptor_decl + uint32 bg_reserved[3]; +- uint32 bg_pad_to_bk[(BLOCKSIZE-32)/sizeof(uint32)]; + } groupdescriptor; + + typedef struct +@@ -304,6 +352,32 @@ + + typedef uint8 block[BLOCKSIZE]; + ++/* blockwalker fields: ++ The blockwalker is used to access all the blocks of a file (including ++ the indirection blocks) through repeated calls to walk_bw. ++ ++ bpdir -> index into the inode->i_block[]. Indicates level of indirection. ++ bnum -> total number of blocks so far accessed. including indirection ++ blocks. ++ bpind,bpdind,bptind -> index into indirection blocks. ++ ++ bpind, bpdind, bptind do *NOT* index into single, double and triple ++ indirect blocks resp. as you might expect from their names. Instead ++ they are in order the 1st, 2nd & 3rd index to be used ++ ++ As an example.. ++ To access data block number 70000: ++ bpdir: 15 (we are doing triple indirection) ++ bpind: 0 ( index into the triple indirection block) ++ bpdind: 16 ( index into the double indirection block) ++ bptind: 99 ( index into the single indirection block) ++ 70000 = 12 + 256 + 256*256 + 16*256 + 100 (indexing starts from zero) ++ ++ So,for double indirection bpind will index into the double indirection ++ block and bpdind into the single indirection block. For single indirection ++ only bpind will be used. ++*/ ++ + typedef struct + { + uint32 bnum; +@@ -313,15 +387,14 @@ + uint32 bptind; + } blockwalker; + ++ ++/* Filesystem structure that support groups */ + #if BLOCKSIZE == 1024 + typedef struct + { + block zero; // The famous block 0 + superblock sb; // The superblock +- groupdescriptor gd; // The group desciptor +- block bbm; // The block bitmap +- block ibm; // The inode bitmap +- inode itab[0]; // The inode table ++ groupdescriptor gd[0]; // The group descriptors + } filesystem; + #else + #error UNHANDLED BLOCKSIZE +@@ -389,25 +462,113 @@ + #undef udecl32 + #undef utdecl32 + +-char * argv0; ++static char * app_name; ++static int squash_uids = 0; ++static int squash_perms = 0; ++static const char *const memory_exhausted = "memory exhausted"; + + // error (un)handling +-inline void errexit(const char *fmt, ...) ++static void verror_msg(const char *s, va_list p) + { +- va_list ap; +- fprintf(stderr, "%s: ", argv0); +- va_start(ap, fmt); +- vfprintf(stderr, fmt, ap); +- va_end(ap); +- fprintf(stderr, "\n"); +- exit(1); ++ fflush(stdout); ++ fprintf(stderr, "%s: ", app_name); ++ vfprintf(stderr, s, p); ++} ++static void error_msg(const char *s, ...) ++{ ++ va_list p; ++ va_start(p, s); ++ verror_msg(s, p); ++ va_end(p); ++ putc('\n', stderr); ++} ++ ++static void error_msg_and_die(const char *s, ...) ++{ ++ va_list p; ++ va_start(p, s); ++ verror_msg(s, p); ++ va_end(p); ++ putc('\n', stderr); ++ exit(EXIT_FAILURE); ++} ++ ++static void vperror_msg(const char *s, va_list p) ++{ ++ int err = errno; ++ if (s == 0) ++ s = ""; ++ verror_msg(s, p); ++ if (*s) ++ s = ": "; ++ fprintf(stderr, "%s%s\n", s, strerror(err)); ++} ++ ++#if 0 ++static void perror_msg(const char *s, ...) ++{ ++ va_list p; ++ va_start(p, s); ++ vperror_msg(s, p); ++ va_end(p); ++} ++#endif ++static void perror_msg_and_die(const char *s, ...) ++{ ++ va_list p; ++ va_start(p, s); ++ vperror_msg(s, p); ++ va_end(p); ++ exit(EXIT_FAILURE); + } + +-inline void pexit(const char * fname) ++static FILE *xfopen(const char *path, const char *mode) + { +- fprintf(stderr, "%s: ", argv0); +- perror(fname); +- exit(1); ++ FILE *fp; ++ if ((fp = fopen(path, mode)) == NULL) ++ perror_msg_and_die("%s", path); ++ return fp; ++} ++ ++static char *xstrdup(const char *s) ++{ ++ char *t; ++ ++ if (s == NULL) ++ return NULL; ++ t = strdup(s); ++ if (t == NULL) ++ error_msg_and_die(memory_exhausted); ++ return t; ++} ++ ++extern void *xrealloc(void *ptr, size_t size) ++{ ++ ptr = realloc(ptr, size); ++ if (ptr == NULL && size != 0) ++ error_msg_and_die(memory_exhausted); ++ return ptr; ++} ++ ++static char *xreadlink(const char *path) ++{ ++ static const int GROWBY = 80; /* how large we will grow strings by */ ++ ++ char *buf = NULL; ++ int bufsize = 0, readsize = 0; ++ ++ do { ++ buf = xrealloc(buf, bufsize += GROWBY); ++ readsize = readlink(path, buf, bufsize); /* 1st try */ ++ if (readsize == -1) { ++ perror_msg_and_die("%s:%s", app_name, path); ++ } ++ } ++ while (bufsize < readsize + 1); ++ ++ buf[readsize] = '\0'; ++ ++ return buf; + } + + // printf helper macro +@@ -423,7 +584,7 @@ + { + } + +-// rounds a quantity up to a blocksize ++/* Rounds qty upto a multiple of siz. siz should be a power of 2 */ + uint32 rndup(uint32 qty, uint32 siz) + { + return (qty + (siz - 1)) & ~(siz - 1); +@@ -444,7 +605,13 @@ + // return a given inode from a filesystem + inline inode * get_nod(filesystem *fs, uint32 nod) + { +- return &fs->itab[nod-1]; ++ int grp,offset; ++ inode *itab; ++ ++ offset = GRP_IBM_OFFSET(fs,nod); ++ grp = GRP_GROUP_OF_INODE(fs,nod); ++ itab = (inode *)get_blk(fs, fs->gd[grp].bg_inode_table); ++ return itab+offset-1; + } + + // allocate a given block/inode in the bitmap +@@ -479,29 +646,57 @@ + } + + // allocate a block +-uint32 alloc_blk(filesystem *fs) ++uint32 alloc_blk(filesystem *fs, uint32 nod) + { +- uint32 bk; +- if(!(bk = allocate(fs->bbm, 0))) +- errexit("couldn't allocate a block (no free space)"); +- if(!(fs->gd.bg_free_blocks_count--)) +- errexit("group descr. free blocks count == 0 (corrupted fs?)"); ++ uint32 bk=0; ++ uint32 grp,nbgroups; ++ ++ grp = nod/fs->sb.s_inodes_per_group; ++ nbgroups = ( fs->sb.s_blocks_count - fs->sb.s_first_data_block + fs->sb.s_blocks_per_group -1 ) / ++ fs->sb.s_blocks_per_group; ++ if(!(bk = allocate(get_blk(fs,fs->gd[grp].bg_block_bitmap), 0))) { ++ for(grp=0;grpgd[grp].bg_block_bitmap),0); ++ grp--; ++ } ++ if (!bk) ++ error_msg_and_die("couldn't allocate a block (no free space)"); ++ if(!(fs->gd[grp].bg_free_blocks_count--)) ++ error_msg_and_die("group descr %d. free blocks count == 0 (corrupted fs?)",grp); + if(!(fs->sb.s_free_blocks_count--)) +- errexit("superblock free blocks count == 0 (corrupted fs?)"); +- return bk; ++ error_msg_and_die("superblock free blocks count == 0 (corrupted fs?)"); ++ return fs->sb.s_blocks_per_group*grp + bk; + } + + // allocate an inode + uint32 alloc_nod(filesystem *fs) + { +- uint32 nod; +- if(!(nod = allocate(fs->ibm, 0))) +- errexit("couldn't allocate an inode (no free inode)"); +- if(!(fs->gd.bg_free_inodes_count--)) +- errexit("group descr. free blocks count == 0 (corrupted fs?)"); ++ uint32 nod=0,best_group=0; ++ uint32 grp,nbgroups,avefreei; ++ ++ nbgroups = ( fs->sb.s_blocks_count - fs->sb.s_first_data_block + fs->sb.s_blocks_per_group -1 ) / ++ fs->sb.s_blocks_per_group; ++ ++ /* Distribute inodes amongst all the blocks */ ++ /* For every block group with more than average number of free inodes */ ++ /* find the one with the most free blocks and allocate node there */ ++ /* Idea from find_group_dir in fs/ext2/ialloc.c in 2.4.19 kernel */ ++ /* We do it for all inodes. */ ++ avefreei = fs->sb.s_free_inodes_count / nbgroups; ++ for(grp=0;grpgd[grp].bg_free_inodes_count < avefreei) ++ continue; ++ if (!best_group || ++ fs->gd[grp].bg_free_blocks_count > fs->gd[best_group].bg_free_blocks_count) ++ best_group = grp; ++ } ++ if (!(nod = allocate(get_blk(fs,fs->gd[best_group].bg_inode_bitmap),0))) ++ error_msg_and_die("couldn't allocate an inode (no free inode)"); ++ if(!(fs->gd[best_group].bg_free_inodes_count--)) ++ error_msg_and_die("group descr. free blocks count == 0 (corrupted fs?)"); + if(!(fs->sb.s_free_inodes_count--)) +- errexit("superblock free blocks count == 0 (corrupted fs?)"); +- return nod; ++ error_msg_and_die("superblock free blocks count == 0 (corrupted fs?)"); ++ return fs->sb.s_inodes_per_group*best_group+nod; + } + + // print a bitmap allocation +@@ -546,14 +741,14 @@ + { + bkref = &get_nod(fs, nod)->i_block[bw->bpdir = 0]; + if(extend) // allocate first block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } + // direct block + else if(bw->bpdir < EXT2_NDIR_BLOCKS) + { + bkref = &get_nod(fs, nod)->i_block[++bw->bpdir]; + if(extend) // allocate block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } + // first block in indirect block + else if(bw->bpdir == EXT2_NDIR_BLOCKS) +@@ -562,11 +757,11 @@ + bw->bpdir = EXT2_IND_BLOCK; + bw->bpind = 0; + if(extend) // allocate indirect block +- get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs); ++ get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs,nod); + b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); + bkref = &b[bw->bpind]; + if(extend) // allocate first block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } + // block in indirect block + else if((bw->bpdir == EXT2_IND_BLOCK) && (bw->bpind < BLOCKSIZE/4 - 1)) +@@ -575,7 +770,7 @@ + b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); + bkref = &b[bw->bpind]; + if(extend) // allocate block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } + // first block in first indirect block in first double indirect block + else if(bw->bpdir == EXT2_IND_BLOCK) +@@ -585,14 +780,14 @@ + bw->bpind = 0; + bw->bpdind = 0; + if(extend) // allocate double indirect block +- get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs); ++ get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs,nod); + b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); + if(extend) // allocate first indirect block +- b[bw->bpind] = alloc_blk(fs); ++ b[bw->bpind] = alloc_blk(fs,nod); + b = (uint32*)get_blk(fs, b[bw->bpind]); + bkref = &b[bw->bpdind]; + if(extend) // allocate first block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } + // block in indirect block in double indirect block + else if((bw->bpdir == EXT2_DIND_BLOCK) && (bw->bpdind < BLOCKSIZE/4 - 1)) +@@ -602,7 +797,7 @@ + b = (uint32*)get_blk(fs, b[bw->bpind]); + bkref = &b[bw->bpdind]; + if(extend) // allocate block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } + // first block in indirect block in double indirect block + else if((bw->bpdir == EXT2_DIND_BLOCK) && (bw->bpind < BLOCKSIZE/4 - 1)) +@@ -612,20 +807,100 @@ + bw->bpind++; + b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); + if(extend) // allocate indirect block +- b[bw->bpind] = alloc_blk(fs); ++ b[bw->bpind] = alloc_blk(fs,nod); + b = (uint32*)get_blk(fs, b[bw->bpind]); + bkref = &b[bw->bpdind]; + if(extend) // allocate first block +- *bkref = hole ? 0 : alloc_blk(fs); ++ *bkref = hole ? 0 : alloc_blk(fs,nod); ++ } ++ ++ /* Adding support for triple indirection */ ++ /* Just starting triple indirection. Allocate the indirection ++ blocks and the first data block ++ */ ++ else if (bw->bpdir == EXT2_DIND_BLOCK) ++ { ++ bw->bnum += 3; ++ bw->bpdir = EXT2_TIND_BLOCK; ++ bw->bpind = 0; ++ bw->bpdind = 0; ++ bw->bptind = 0; ++ if(extend) // allocate triple indirect block ++ get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs,nod); ++ b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); ++ if(extend) // allocate first double indirect block ++ b[bw->bpind] = alloc_blk(fs,nod); ++ b = (uint32*)get_blk(fs, b[bw->bpind]); ++ if(extend) // allocate first indirect block ++ b[bw->bpdind] = alloc_blk(fs,nod); ++ b = (uint32*)get_blk(fs, b[bw->bpdind]); ++ bkref = &b[bw->bptind]; ++ if(extend) // allocate first data block ++ *bkref = hole ? 0 : alloc_blk(fs,nod); ++ } ++ /* Still processing a single indirect block down the indirection ++ chain.Allocate a data block for it ++ */ ++ else if ( (bw->bpdir == EXT2_TIND_BLOCK) && ++ (bw->bptind < BLOCKSIZE/4 -1) ) ++ { ++ bw->bptind++; ++ b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); ++ b = (uint32*)get_blk(fs, b[bw->bpind]); ++ b = (uint32*)get_blk(fs, b[bw->bpdind]); ++ bkref = &b[bw->bptind]; ++ if(extend) // allocate data block ++ *bkref = hole ? 0 : alloc_blk(fs,nod); ++ } ++ /* Finished processing a single indirect block. But still in the ++ same double indirect block. Allocate new single indirect block ++ for it and a data block ++ */ ++ else if ( (bw->bpdir == EXT2_TIND_BLOCK) && ++ (bw->bpdind < BLOCKSIZE/4 -1) ) ++ { ++ bw->bnum++; ++ bw->bptind = 0; ++ bw->bpdind++; ++ b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); ++ b = (uint32*)get_blk(fs, b[bw->bpind]); ++ if (extend) // allocate single indirect block ++ b[bw->bpdind] = alloc_blk(fs,nod); ++ b = (uint32*)get_blk(fs, b[bw->bpdind]); ++ bkref = &b[bw->bptind]; ++ if(extend) // allocate first data block ++ *bkref = hole ? 0 : alloc_blk(fs,nod); ++ } ++ /* Finished processing a double indirect block. Allocate the next ++ double indirect block and the single,data blocks for it ++ */ ++ else if ( (bw->bpdir == EXT2_TIND_BLOCK) && ++ (bw->bpind < BLOCKSIZE/4 - 1) ) ++ { ++ bw->bnum += 2; ++ bw->bpdind = 0; ++ bw->bptind = 0; ++ bw->bpind++; ++ b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]); ++ if(extend) // allocate double indirect block ++ b[bw->bpind] = alloc_blk(fs,nod); ++ b = (uint32*)get_blk(fs, b[bw->bpind]); ++ if(extend) // allocate single indirect block ++ b[bw->bpdind] = alloc_blk(fs,nod); ++ b = (uint32*)get_blk(fs, b[bw->bpdind]); ++ bkref = &b[bw->bptind]; ++ if(extend) // allocate first block ++ *bkref = hole ? 0 : alloc_blk(fs,nod); + } +- // I don't do triple indirect - it's such a small filesystem ... + else +- errexit("file too big ! blocks list for inode %d extends past double indirect blocks!", nod); ++ error_msg_and_die("file too big !"); ++ /* End change for walking triple indirection */ ++ + if(*bkref) + { + bw->bnum++; +- if(!allocated(fs->bbm, *bkref)) +- errexit("[block %d of inode %d is unallocated !]", *bkref, nod); ++ if(!allocated(GRP_GET_BLOCK_BITMAP(fs,*bkref), GRP_BBM_OFFSET(fs,*bkref))) ++ error_msg_and_die("[block %d of inode %d is unallocated !]", *bkref, nod); + } + if(extend) + get_nod(fs, nod)->i_blocks = bw->bnum * INOBLK; +@@ -663,23 +938,40 @@ + } + + // link an entry (inode #) to a directory +-void add2dir(filesystem *fs, uint32 dnod, uint32 nod, const char* name) ++void add2dir(filesystem *fs, uint32 dnod, uint32 nod, const char* name, uint32 mode, uid_t uid, gid_t gid, time_t ctime) + { + blockwalker bw; + uint32 bk; + uint8 *b; + directory *d; + int reclen, nlen; +- if((get_nod(fs, dnod)->i_mode & FM_IFMT) != FM_IFDIR) +- errexit("can't add '%s' to a non-directory", name); ++ inode *node; ++ inode *pnode; ++ ++ /* Squash all permissions so files are owned by root ++ * and file permissions have group/other perms removed */ ++ if (squash_uids) { ++ uid = gid = 0; ++ } ++ if (squash_perms) { ++ if (!S_ISLNK(mode)) { ++ mode &= ~(S_IWGRP | S_IWOTH); ++ mode &= ~(S_ISUID | S_ISGID); ++ } ++ } ++ ++ pnode = get_nod(fs, dnod); ++ ++ if(!S_ISDIR(pnode->i_mode)) ++ error_msg_and_die("can't add '%s' to a non-directory", name); + if(!*name) +- errexit("bad name '%s' (not meaningful)", name); ++ error_msg_and_die("bad name '%s' (not meaningful)", name); + if(strchr(name, '/')) +- errexit("bad name '%s' (contains a slash)", name); ++ error_msg_and_die("bad name '%s' (contains a slash)", name); + nlen = strlen(name); + reclen = sizeof(directory) + rndup(nlen, 4); + if(reclen > BLOCKSIZE) +- errexit("bad name '%s' (too long)", name); ++ error_msg_and_die("bad name '%s' (too long)", name); + init_bw(fs, dnod, &bw); + while((bk = walk_bw(fs, dnod, &bw, 0, 0)) != WALK_END) // for all blocks in dir + { +@@ -691,9 +983,16 @@ + if((!d->d_inode) && (d->d_rec_len >= reclen)) + { + d->d_inode = nod; +- get_nod(fs, nod)->i_links_count++; ++ node = get_nod(fs, nod); ++ node->i_links_count++; + d->d_name_len = nlen; +- strncpy(d->d_name, name, nlen); ++ strncpy(d->d_name, name, rndup(nlen,4)); ++ node->i_mode = mode; ++ node->i_uid = uid; ++ node->i_gid = gid; ++ node->i_atime = ctime; ++ node->i_ctime = ctime; ++ node->i_mtime = ctime; + return; + } + // if entry with enough room (last one?), shrink it & use it +@@ -705,9 +1004,16 @@ + d = (directory*) (((int8*)d) + d->d_rec_len); + d->d_rec_len = reclen; + d->d_inode = nod; +- get_nod(fs, nod)->i_links_count++; ++ node = get_nod(fs, nod); ++ node->i_links_count++; + d->d_name_len = nlen; +- strncpy(d->d_name, name, nlen); ++ strncpy(d->d_name, name, rndup(nlen,4)); ++ node->i_mode = mode; ++ node->i_uid = uid; ++ node->i_gid = gid; ++ node->i_atime = ctime; ++ node->i_ctime = ctime; ++ node->i_mtime = ctime; + return; + } + } +@@ -716,10 +1022,17 @@ + b = get_workblk(); + d = (directory*)b; + d->d_inode = nod; +- get_nod(fs, nod)->i_links_count++; ++ node = get_nod(fs, nod); ++ node->i_links_count++; + d->d_rec_len = BLOCKSIZE; + d->d_name_len = nlen; +- strncpy(d->d_name, name, nlen); ++ strncpy(d->d_name, name, rndup(nlen,4)); ++ node->i_mode = mode; ++ node->i_uid = uid; ++ node->i_gid = gid; ++ node->i_atime = ctime; ++ node->i_ctime = ctime; ++ node->i_mtime = ctime; + extend_blk(fs, dnod, b, 1); + get_nod(fs, dnod)->i_size += BLOCKSIZE; + free_workblk(b); +@@ -747,7 +1060,7 @@ + // find the inode of a full path + uint32 find_path(filesystem *fs, uint32 nod, const char * name) + { +- char *p, *n, *n2 = strdup(name); ++ char *p, *n, *n2 = xstrdup(name); + n = n2; + while(*n == '/') + { +@@ -770,27 +1083,32 @@ + } + + // make a full-fledged directory (i.e. with "." & "..") +-uint32 mkdir_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode) ++uint32 mkdir_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode, ++ uid_t uid, gid_t gid, time_t ctime) + { + uint32 nod; + if((nod = find_dir(fs, parent_nod, name))) + return nod; + nod = alloc_nod(fs); +- get_nod(fs, nod)->i_mode = FM_IFDIR | mode; +- add2dir(fs, parent_nod, nod, name); +- add2dir(fs, nod, nod, "."); +- add2dir(fs, nod, parent_nod, ".."); +- fs->gd.bg_used_dirs_count++; ++ if (!(mode & FM_IFDIR)) ++ mode |= FM_IFDIR; ++ add2dir(fs, parent_nod, nod, name, mode, uid, gid, ctime); ++ add2dir(fs, nod, nod, ".", mode, uid, gid, ctime); ++ add2dir(fs, nod, parent_nod, "..", mode, uid, gid, ctime); ++ fs->gd[GRP_GROUP_OF_INODE(fs,nod)].bg_used_dirs_count++; + return nod; + } + + // make a symlink +-uint32 mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, size_t size, uint8 * b) ++uint32 mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, size_t size, ++ uint8 * b, uid_t uid, gid_t gid, time_t ctime) + { ++ uint32 mode; + uint32 nod = alloc_nod(fs); ++ mode = FM_IFLNK | FM_IRWXU | FM_IRWXG | FM_IRWXO; + get_nod(fs, nod)->i_mode = FM_IFLNK | FM_IRWXU | FM_IRWXG | FM_IRWXO; + get_nod(fs, nod)->i_size = size; +- add2dir(fs, parent_nod, nod, name); ++ add2dir(fs, parent_nod, nod, name, mode, uid, gid, ctime); + if(size <= 4 * (EXT2_TIND_BLOCK+1)) + { + strncpy((char*)get_nod(fs, nod)->i_block, (char*)b, size); +@@ -801,15 +1119,15 @@ + } + + // make a file from a FILE* +-uint32 mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode, size_t size, FILE *f) ++uint32 mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode, size_t size, FILE *f, uid_t uid, gid_t gid, time_t ctime) + { + uint8 * b; + uint32 nod = alloc_nod(fs); +- get_nod(fs, nod)->i_mode = FM_IFREG | mode; ++ mode |= FM_IFREG; + get_nod(fs, nod)->i_size = size; +- add2dir(fs, parent_nod, nod, name); ++ add2dir(fs, parent_nod, nod, name, mode, uid, gid, ctime); + if(!(b = (uint8*)malloc(rndup(size, BLOCKSIZE)))) +- errexit("not enough mem to read file '%s'", name); ++ error_msg_and_die("not enough mem to read file '%s'", name); + memset(b, 0,rndup(size, BLOCKSIZE)); + if(f) + fread(b, size, 1, f); +@@ -824,6 +1142,15 @@ + uint32 get_mode(struct stat *st) + { + uint32 mode = 0; ++ ++ /* Squash file permissions as needed */ ++ if (squash_perms) { ++ if (!S_ISLNK(mode)) { ++ st->st_mode &= ~(S_IWGRP | S_IWOTH); ++ st->st_mode &= ~(S_ISUID | S_ISGID); ++ } ++ } ++ + if(st->st_mode & S_IRUSR) + mode |= FM_IRUSR | FM_IRGRP | FM_IROTH; + if(st->st_mode & S_IWUSR) +@@ -833,30 +1160,17 @@ + return mode; + } + +-// retrieves a mode info from a string +-uint32 get_modestr(const char *p) +-{ +- uint32 mode = 0; +- if(p[0] == 'r') +- mode |= FM_IRUSR | FM_IRGRP | FM_IROTH; +- if(p[1] == 'w') +- mode |= FM_IWUSR | FM_IWGRP | FM_IWOTH; +- if(p[2] == 'x' || p[2] == 's') +- mode |= FM_IXUSR | FM_IXGRP | FM_IXOTH; +- return mode; +-} +- + // basename of a path - free me + char * basename(const char * fullpath) + { + char * p = strrchr(fullpath, '/'); +- return strdup(p ? p + 1 : fullpath); ++ return xstrdup(p ? p + 1 : fullpath); + } + + // dirname of a path - free me + char * dirname(const char * fullpath) + { +- char * p, * n = strdup(fullpath); ++ char * p, * n = xstrdup(fullpath); + if((p = strrchr(n, '/'))) + *(p+1) = 0; + else +@@ -864,66 +1178,6 @@ + return n; + } + +-// adds entries to the filesystem from a text file +-void add2fs_from_file(filesystem *fs, uint32 this_nod, FILE * fh) +-{ +- uint32 mode; +- uint32 nod, nod2; +- char cmod[11], *path, *name, *dir; +- int major, minor; +- while(fscanf(fh, "%10s", cmod)) +- { +- if(feof(fh)) +- break; +- mode = get_modestr(cmod + 1); +- switch(*cmod) +- { +- case 'd': +- fscanf(fh, "%" SCANF_PREFIX "s\n", SCANF_STRING(path)); +- break; +- case 'c': +- mode |= FM_IFCHR; +- fscanf(fh, "%i, %i %" SCANF_PREFIX "s\n", &major, &minor, SCANF_STRING(path)); +- break; +- case 'b': +- mode |= FM_IFBLK; +- fscanf(fh, "%i, %i %" SCANF_PREFIX "s\n", &major, &minor, SCANF_STRING(path)); +- break; +- case '#': +- while(fgetc(fh) != '\n'); +- continue; +- default: +- errexit("malformed text input file"); +- } +- name = basename(path); +- dir = dirname(path); +- free(path); +- if(!(nod = find_path(fs, this_nod, dir))) +- errexit("can't find directory '%s' to create '%s''", dir, name); +- free(dir); +- if((!strcmp(name, ".")) || (!strcmp(name, ".."))) +- { +- free(name); +- continue; +- } +- switch(*cmod) +- { +- case 'd': +- mkdir_fs(fs, nod, name, mode); +- break; +- case 'c': +- case 'b': +- nod2 = alloc_nod(fs); +- get_nod(fs, nod2)->i_mode = mode; +- ((uint8*)get_nod(fs, nod2)->i_block)[0] = minor; +- ((uint8*)get_nod(fs, nod2)->i_block)[1] = major; +- add2dir(fs, nod, nod2, name); +- break; +- } +- free(name); +- } +-} +- + // adds a tree of entries to the filesystem from current dir + void add2fs_from_dir(filesystem *fs, uint32 this_nod) + { +@@ -934,7 +1188,7 @@ + struct stat st; + uint8 *b; + if(!(dh = opendir("."))) +- pexit("."); ++ perror_msg_and_die("."); + while((dent = readdir(dh))) + { + if((!strcmp(dent->d_name, ".")) || (!strcmp(dent->d_name, ".."))) +@@ -948,31 +1202,27 @@ + get_nod(fs, nod)->i_mode = (((st.st_mode & S_IFMT) == S_IFCHR) ? FM_IFCHR : FM_IFBLK) | get_mode(&st); + ((uint8*)get_nod(fs, nod)->i_block)[0] = (st.st_rdev & 0xff); + ((uint8*)get_nod(fs, nod)->i_block)[1] = (st.st_rdev >> 8); +- add2dir(fs, this_nod, nod, dent->d_name); ++ add2dir(fs, this_nod, nod, dent->d_name, st.st_mode, st.st_uid, st.st_gid, st.st_ctime); + break; + case S_IFLNK: +- if(!(b = (uint8*)malloc(rndup(st.st_size, BLOCKSIZE)))) +- errexit("out of memory"); +- if(readlink(dent->d_name, (char*)b, st.st_size) < 0) +- pexit(dent->d_name); +- mklink_fs(fs, this_nod, dent->d_name, st.st_size, b); ++ b = xreadlink(dent->d_name); ++ mklink_fs(fs, this_nod, dent->d_name, st.st_size, b, st.st_uid, st.st_gid, st.st_ctime); + free(b); + break; + case S_IFREG: +- if(!(fh = fopen(dent->d_name, "r"))) +- pexit(dent->d_name); +- mkfile_fs(fs, this_nod, dent->d_name, get_mode(&st), st.st_size, fh); ++ fh = xfopen(dent->d_name, "r"); ++ mkfile_fs(fs, this_nod, dent->d_name, st.st_mode, st.st_size, fh, st.st_uid, st.st_gid, st.st_ctime); + fclose(fh); + break; + case S_IFDIR: +- nod = mkdir_fs(fs, this_nod, dent->d_name, get_mode(&st)); ++ nod = mkdir_fs(fs, this_nod, dent->d_name, st.st_mode, st.st_uid, st.st_gid, st.st_ctime); + if(chdir(dent->d_name) < 0) +- pexit(dent->d_name); ++ perror_msg_and_die(dent->d_name); + add2fs_from_dir(fs, nod); + chdir(".."); + break; + default: +- fprintf(stderr, "ignoring entry %s", dent->d_name); ++ error_msg("ignoring entry %s", dent->d_name); + } + } + closedir(dh); +@@ -981,9 +1231,11 @@ + // endianness swap of x-indirect blocks + void swap_goodblocks(filesystem *fs, inode *nod) + { +- int i; ++ int i,j,done=0; ++ uint32 *b,*b2; ++ + int nblk = nod->i_blocks / INOBLK; +- if((nod->i_size && !nblk) || (nod->i_mode & (FM_IFBLK | FM_IFCHR))) ++ if((nod->i_size && !nblk) || ((nod->i_mode & FM_IFBLK) == FM_IFBLK) || ((nod->i_mode & FM_IFCHR) == FM_IFCHR)) + for(i = 0; i <= EXT2_TIND_BLOCK; i++) + nod->i_block[i] = swab32(nod->i_block[i]); + if(nblk <= EXT2_IND_BLOCK) +@@ -991,20 +1243,55 @@ + swap_block(get_blk(fs, nod->i_block[EXT2_IND_BLOCK])); + if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4) + return; ++ /* Currently this will fail b'cos the number of blocks as stored ++ in i_blocks also includes the indirection blocks (see ++ walk_bw). But this function assumes that i_blocks only ++ stores the count of data blocks ( Actually according to ++ "Understanding the Linux Kernel" (Table 17-3 p502 1st Ed) ++ i_blocks IS supposed to store the count of data blocks). so ++ with a file of size 268K nblk would be 269.The above check ++ will be false even though double indirection hasn't been ++ started.This is benign as 0 means block 0 which has been ++ zeroed out and therefore points back to itself from any offset ++ */ ++ assert(nod->i_block[EXT2_DIND_BLOCK] != 0); + for(i = 0; i < BLOCKSIZE/4; i++) ++ /* Should this be... ++ if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i ) ++ */ + if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + i) + swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])); + swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK])); + if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4) + return; +- errexit("too big file on the filesystem"); ++ /* Adding support for triple indirection */ ++ b = (uint32*)get_blk(fs,nod->i_block[EXT2_TIND_BLOCK]); ++ for(i=0;i < BLOCKSIZE/4 && !done ; i++) { ++ b2 = (uint32*)get_blk(fs,b[i]); ++ for(j=0; j ( EXT2_IND_BLOCK + BLOCKSIZE/4 + ++ (BLOCKSIZE/4)*(BLOCKSIZE/4) + ++ i*(BLOCKSIZE/4)*(BLOCKSIZE/4) + ++ j*(BLOCKSIZE/4)) ) ++ swap_block(get_blk(fs,b2[j])); ++ else { ++ done = 1; ++ break; ++ } ++ } ++ swap_block((uint8 *)b2); ++ } ++ swap_block((uint8 *)b); ++ return; + } + + void swap_badblocks(filesystem *fs, inode *nod) + { +- int i; ++ int i,j,done=0; ++ uint32 *b,*b2; ++ + int nblk = nod->i_blocks / INOBLK; +- if((nod->i_size && !nblk) || (nod->i_mode & (FM_IFBLK | FM_IFCHR))) ++ if((nod->i_size && !nblk) || ((nod->i_mode & FM_IFBLK) == FM_IFBLK) || ((nod->i_mode & FM_IFCHR) == FM_IFCHR)) + for(i = 0; i <= EXT2_TIND_BLOCK; i++) + nod->i_block[i] = swab32(nod->i_block[i]); + if(nblk <= EXT2_IND_BLOCK) +@@ -1012,13 +1299,34 @@ + swap_block(get_blk(fs, nod->i_block[EXT2_IND_BLOCK])); + if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4) + return; ++ /* See comment in swap_goodblocks */ ++ assert(nod->i_block[EXT2_DIND_BLOCK] != 0); + swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK])); + for(i = 0; i < BLOCKSIZE/4; i++) ++ /* See comment in swap_goodblocks */ + if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + i) + swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])); + if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4) + return; +- errexit("too big file on the filesystem"); ++ /* Adding support for triple indirection */ ++ b = (uint32*)get_blk(fs,nod->i_block[EXT2_TIND_BLOCK]); ++ swap_block((uint8 *)b); ++ for(i=0;i < BLOCKSIZE/4 && !done ; i++) { ++ b2 = (uint32*)get_blk(fs,b[i]); ++ swap_block((uint8 *)b2); ++ for(j=0; j ( EXT2_IND_BLOCK + BLOCKSIZE/4 + ++ (BLOCKSIZE/4)*(BLOCKSIZE/4) + ++ i*(BLOCKSIZE/4)*(BLOCKSIZE/4) + ++ j*(BLOCKSIZE/4)) ) ++ swap_block(get_blk(fs,b2[j])); ++ else { ++ done = 1; ++ break; ++ } ++ } ++ } ++ return; + } + + // endianness swap of the whole filesystem +@@ -1045,7 +1353,8 @@ + swap_goodblocks(fs, nod); + swap_nod(nod); + } +- swap_gd(&fs->gd); ++ for(i=0;igd[i])); + swap_sb(&fs->sb); + } + +@@ -1053,7 +1362,8 @@ + { + int i; + swap_sb(&fs->sb); +- swap_gd(&fs->gd); ++ for(i=0;igd[i])); + for(i = 1; i < fs->sb.s_inodes_count; i++) + { + inode *nod = get_nod(fs, i); +@@ -1084,53 +1394,118 @@ + directory *d; + uint8 * b; + uint32 nod; ++ uint32 nbgroups,nbinodes_per_group,overhead_per_group,free_blocks, ++ free_blocks_per_group,nbblocks_per_group; ++ uint32 gd,itbl,ibmpos,bbmpos,itblpos; ++ int j; ++ uint8 *bbm,*ibm; ++ inode *itab0; + + if(nbblocks < 16) // totally arbitrary +- errexit("too small filesystem"); +- if(nbblocks >BLOCKS_PER_GROUP) // I build only one group +- errexit("too big filesystem"); ++ error_msg_and_die("too small filesystem"); ++ ++ /* nbblocks is the total number of blocks in the system. First ++ * calculate how much overhead blocks - inode table blocks,bitmap ++ * blocks,group descriptor blocks etc. - are needed assuming each ++ * group has BLOCKS_PER_GROUP blocks.Then recalculate nbblocks with ++ * this figure. Each group has the same number of blocks. So the fs ++ * has a size atleast the given value but usually rounded off to a i ++ * higher number. ++ */ ++ nbgroups = rndup(nbblocks,BLOCKS_PER_GROUP)/ BLOCKS_PER_GROUP; ++ nbinodes_per_group = nbinodes/nbgroups +1; ++ nbinodes_per_group = rndup(nbinodes_per_group, BLOCKSIZE/sizeof(inode)); ++ if (nbinodes_per_group < 16) ++ nbinodes_per_group = 16; //minimum number b'cos the first 10 are reserved ++ overhead_per_group = 3 /*super block,ibm,bbm*/ ++ + /* No. of blocks that the inodes occupy */ ++ nbinodes_per_group *sizeof(inode)/BLOCKSIZE ++ + /* No. of blocks that group descriptors occupy */ ++ rndup(nbgroups*sizeof(groupdescriptor),BLOCKSIZE)/BLOCKSIZE; ++ free_blocks = nbblocks - overhead_per_group * nbgroups - 1 /*boot block */; ++ free_blocks_per_group = free_blocks/nbgroups; ++ if (free_blocks > free_blocks_per_group * nbgroups) ++ free_blocks_per_group++; ++ nbblocks_per_group = free_blocks_per_group + overhead_per_group; ++ /* e2fsck complains if nbblocks_per_group is not a multiple of 8 */ ++ nbblocks_per_group = rndup(nbblocks_per_group,8); ++ free_blocks_per_group = nbblocks_per_group - overhead_per_group; ++ if (nbblocks_per_group > BLOCKS_PER_GROUP) { ++ /* Can this happen ? */ ++ nbblocks_per_group = BLOCKS_PER_GROUP; ++ free_blocks_per_group = nbblocks_per_group - overhead_per_group; ++ } ++ nbblocks = nbblocks_per_group * nbgroups + 1; ++ ++ + if(!(fs = (filesystem*)calloc(nbblocks, BLOCKSIZE))) +- errexit("not enough memory for filesystem"); ++ error_msg_and_die("not enough memory for filesystem"); + + // create the superblock for an empty filesystem +- fs->sb.s_inodes_count = rndup(nbinodes, BLOCKSIZE/sizeof(inode)); ++ fs->sb.s_inodes_count = nbinodes_per_group * nbgroups; + fs->sb.s_blocks_count = nbblocks; + fs->sb.s_r_blocks_count = nbresrvd; +- fs->sb.s_free_blocks_count = nbblocks; ++ fs->sb.s_free_blocks_count = free_blocks_per_group*nbgroups; + fs->sb.s_free_inodes_count = fs->sb.s_inodes_count - EXT2_FIRST_INO + 1; + fs->sb.s_first_data_block = (BLOCKSIZE == 1024); + fs->sb.s_log_block_size = BLOCKSIZE >> 11; + fs->sb.s_log_frag_size = BLOCKSIZE >> 11; +- fs->sb.s_blocks_per_group = BLOCKS_PER_GROUP; +- fs->sb.s_frags_per_group = BLOCKS_PER_GROUP; +- fs->sb.s_inodes_per_group = fs->sb.s_inodes_count; ++ fs->sb.s_blocks_per_group = nbblocks_per_group; ++ fs->sb.s_frags_per_group = nbblocks_per_group; ++ fs->sb.s_inodes_per_group = nbinodes_per_group; + fs->sb.s_magic = EXT2_MAGIC_NUMBER; + + // set up groupdescriptors +- fs->sb.s_free_blocks_count -= 5 + fs->sb.s_inodes_count * sizeof(inode) / BLOCKSIZE; +- fs->gd.bg_free_blocks_count = fs->sb.s_free_blocks_count; +- fs->gd.bg_free_inodes_count = fs->sb.s_free_inodes_count; +- fs->gd.bg_used_dirs_count = 1; +- fs->gd.bg_block_bitmap = 3; +- fs->gd.bg_inode_bitmap = 4; +- fs->gd.bg_inode_table = 5; +- +- // mark non-filesystem blocks and inodes as allocated +- for(i = fs->sb.s_blocks_count; i <= BLOCKSIZE * 8; i++) +- allocate(fs->bbm, i); +- for(i = fs->sb.s_inodes_count + 1; i <= BLOCKSIZE * 8; i++) +- allocate(fs->ibm, i); +- +- // mark system blocsk and inodes as allocated +- for(i = 1; i <= 4 + fs->sb.s_inodes_count * sizeof(inode) / BLOCKSIZE; i++) +- allocate(fs->bbm, i); +- for(i = 1; i < EXT2_FIRST_INO; i++) +- allocate(fs->ibm, i); +- +- // make root inode and directory +- fs->itab[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | FM_IRWXU | FM_IRWXG | FM_IRWXO; +- fs->itab[EXT2_ROOT_INO-1].i_size = BLOCKSIZE; +- fs->itab[EXT2_ROOT_INO-1].i_links_count = 2; ++ gd = rndup(nbgroups*sizeof(groupdescriptor),BLOCKSIZE)/BLOCKSIZE; ++ itbl = nbinodes_per_group*sizeof(inode)/BLOCKSIZE; ++ for(i = 0,bbmpos=2+gd,ibmpos=3+gd,itblpos =4+gd; ++ igd[i].bg_free_blocks_count = free_blocks_per_group; ++ fs->gd[i].bg_free_inodes_count = nbinodes_per_group; ++ fs->gd[i].bg_used_dirs_count = 0; ++ fs->gd[i].bg_block_bitmap = bbmpos; ++ fs->gd[i].bg_inode_bitmap = ibmpos; ++ fs->gd[i].bg_inode_table = itblpos; ++ } ++ ++ /* Mark non-filesystem blocks and inodes as allocated */ ++ /* Mark system blocks and inodes as allocated */ ++ for(i = 0; igd[i].bg_block_bitmap); ++ //non-filesystem blocks. ++ for(j=fs->sb.s_blocks_per_group + 1; j <= BLOCKSIZE * 8; j++) ++ allocate(bbm, j); ++ //system blocks ++ for(j = 1; j <= 3+gd+itbl; j++) ++ allocate(bbm, j); ++ ++ /* Inode bitmap */ ++ ibm = get_blk(fs,fs->gd[i].bg_inode_bitmap); ++ //non-filesystem inodes ++ for(j = fs->sb.s_inodes_per_group+1; j <= BLOCKSIZE * 8; j++) ++ allocate(ibm, j); ++ } ++ ++ /* We have groups now. Add the root filesystem in group 0 */ ++ /* Also allocate the system inodes in group 0 and update */ ++ /* directory count and inode count for group 0 */ ++ ++ ibm = get_blk(fs,fs->gd[0].bg_inode_bitmap); ++ for(j = 1; j < EXT2_FIRST_INO; j++) { ++ allocate(ibm, j); ++ fs->gd[0].bg_free_inodes_count--; ++ } ++ fs->gd[0].bg_used_dirs_count = 1; ++ itab0 = (inode *)get_blk(fs,fs->gd[0].bg_inode_table); ++ itab0[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | FM_IRWXU | FM_IRWXG | FM_IRWXO; ++ itab0[EXT2_ROOT_INO-1].i_size = BLOCKSIZE; ++ itab0[EXT2_ROOT_INO-1].i_links_count = 2; ++ + b = get_workblk(); + d = (directory*)b; + d->d_inode = EXT2_ROOT_INO; +@@ -1147,9 +1522,14 @@ + // make lost+found directory and reserve blocks + if(fs->sb.s_r_blocks_count) + { +- nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", FM_IRWXU | FM_IRWXG | FM_IRWXO); ++ nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, 0, 0, time(NULL)); + memset(b, 0, BLOCKSIZE); + ((directory*)b)->d_rec_len = BLOCKSIZE; ++ /* We run into problems with e2fsck if directory lost+found grows ++ * bigger than this. Need to find out why this happens - sundar ++ */ ++ if (fs->sb.s_r_blocks_count > 2049 ) ++ fs->sb.s_r_blocks_count=2049; + for(i = 1; i < fs->sb.s_r_blocks_count; i++) + extend_blk(fs, nod, b, 1); + get_nod(fs, nod)->i_size = fs->sb.s_r_blocks_count * BLOCKSIZE; +@@ -1170,24 +1550,24 @@ + // loads a filesystem from disk + filesystem * load_fs(FILE * fh, int swapit) + { +- size_t fssize; ++ size_t fssize = 0; + filesystem *fs; + if((fseek(fh, 0, SEEK_END) < 0) || ((fssize = ftell(fh)) < 0)) +- pexit("input filesystem image"); ++ perror_msg_and_die("input filesystem image"); + rewind(fh); + fssize = (fssize + BLOCKSIZE - 1) / BLOCKSIZE; + if(fssize < 16) // totally arbitrary +- errexit("too small filesystem"); +- if(fssize > BLOCKS_PER_GROUP) // I build only one group +- errexit("too big filesystem"); ++ error_msg_and_die("too small filesystem"); ++/* if(fssize > BLOCKS_PER_GROUP) // I build only one group ++ error_msg_and_die("too big filesystem"); */ + if(!(fs = (filesystem*)calloc(fssize, BLOCKSIZE))) +- errexit("not enough memory for filesystem"); ++ error_msg_and_die("not enough memory for filesystem"); + if(fread(fs, BLOCKSIZE, fssize, fh) != fssize) +- pexit("input filesystem image"); ++ perror_msg_and_die("input filesystem image"); + if(swapit) + swap_badfs(fs); + if(fs->sb.s_rev_level || (fs->sb.s_magic != EXT2_MAGIC_NUMBER)) +- errexit("not a suitable ext2 filesystem"); ++ error_msg_and_die("not a suitable ext2 filesystem"); + return fs; + } + +@@ -1230,9 +1610,9 @@ + while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END) + { + if(fsize <= 0) +- errexit("wrong size while saving inode %d", nod); ++ error_msg_and_die("wrong size while saving inode %d", nod); + if(fwrite(get_blk(fs, bk), (fsize > BLOCKSIZE) ? BLOCKSIZE : fsize, 1, f) != 1) +- errexit("error while saving inode %d", nod); ++ error_msg_and_die("error while saving inode %d", nod); + fsize -= BLOCKSIZE; + } + } +@@ -1250,7 +1630,7 @@ + { + int i, j; + if(fsize <= 0) +- errexit("wrong size while saving inode %d", nod); ++ error_msg_and_die("wrong size while saving inode %d", nod); + b = get_blk(fs, bk); + for(i = 0; i < 64; i++) + { +@@ -1406,7 +1786,7 @@ + s = (nod >= EXT2_FIRST_INO) ? "normal" : "unknown reserved"; + } + printf("inode %d (%s, %d links): ", nod, s, get_nod(fs, nod)->i_links_count); +- if(!allocated(fs->ibm, nod)) ++ if(!allocated(GRP_GET_INODE_BITMAP(fs,nod), GRP_IBM_OFFSET(fs,nod))) + { + printf("unallocated\n"); + return; +@@ -1440,24 +1820,46 @@ + default: + list_blocks(fs, nod); + } ++ printf("Done with inode %d\n",nod); + } + + // describes various fields in a filesystem + void print_fs(filesystem *fs) + { +- int i; +- printf("%d blocks (%d free, %d reserved), first data block: %d\n", fs->sb.s_blocks_count, fs->sb.s_free_blocks_count, fs->sb.s_r_blocks_count, fs->sb.s_first_data_block); +- printf("%d inodes (%d free)\n", fs->sb.s_inodes_count, fs->sb.s_free_inodes_count); +- printf("block size = %d, frag size = %d\n", fs->sb.s_log_block_size ? (fs->sb.s_log_block_size << 11) : 1024, fs->sb.s_log_frag_size ? (fs->sb.s_log_frag_size << 11) : 1024); +- printf("%d blocks per group, %d frags per group, %d inodes per group\n", fs->sb.s_blocks_per_group, fs->sb.s_frags_per_group, fs->sb.s_inodes_per_group); +- printf("block bitmap: block %d, inode bitmap: block %d, inode table: block %d\n", fs->gd.bg_block_bitmap, fs->gd.bg_inode_bitmap, fs->gd.bg_inode_table); +- printf("block bitmap allocation:\n"); +- print_bm(fs->bbm, fs->sb.s_blocks_count); +- printf("inode bitmap allocation:\n"); +- print_bm(fs->ibm, fs->sb.s_inodes_count); +- for(i=1; i<=fs->sb.s_inodes_count; i++) +- if(allocated(fs->ibm, i)) +- print_inode(fs, i); ++ int i,j; ++ uint8 *ibm; ++ ++ printf("%d blocks (%d free, %d reserved), first data block: %d\n", ++ fs->sb.s_blocks_count, fs->sb.s_free_blocks_count, ++ fs->sb.s_r_blocks_count, fs->sb.s_first_data_block); ++ printf("%d inodes (%d free)\n", fs->sb.s_inodes_count, ++ fs->sb.s_free_inodes_count); ++ printf("block size = %d, frag size = %d\n", ++ fs->sb.s_log_block_size ? (fs->sb.s_log_block_size << 11) : 1024, ++ fs->sb.s_log_frag_size ? (fs->sb.s_log_frag_size << 11) : 1024); ++ printf("Number of groups: %d\n",GRP_NBGROUPS(fs)); ++ printf("%d blocks per group,%d frags per group,%d inodes per group\n", ++ fs->sb.s_blocks_per_group, fs->sb.s_frags_per_group, ++ fs->sb.s_inodes_per_group); ++ printf("Size of inode table: %d blocks\n", ++ fs->sb.s_inodes_per_group * sizeof(inode)/BLOCKSIZE); ++ for (i = 0; i < GRP_NBGROUPS(fs); i++) { ++ printf("Group No: %d\n", i); ++ printf("block bitmap: block %d,inode bitmap: block %d, inode table: block %d\n", ++ fs->gd[i].bg_block_bitmap, fs->gd[i].bg_inode_bitmap, ++ fs->gd[i].bg_inode_table); ++ printf("Free blocks count: %d\n",fs->gd[i].bg_free_blocks_count); ++ printf("Free inodes count: %d\n",fs->gd[i].bg_free_inodes_count); ++ printf("Used dir count: %d\n",fs->gd[i].bg_used_dirs_count); ++ printf("block bitmap allocation:\n"); ++ print_bm(GRP_GET_GROUP_BBM(fs, i),fs->sb.s_blocks_per_group); ++ printf("inode bitmap allocation:\n"); ++ ibm = GRP_GET_GROUP_IBM(fs, i); ++ print_bm(ibm, fs->sb.s_inodes_per_group); ++ for (j = 1; j <= fs->sb.s_inodes_per_group; j++) ++ if (allocated(ibm, j)) ++ print_inode(fs, i*fs->sb.s_inodes_per_group + j); ++ } + } + + void dump_fs(filesystem *fs, FILE * fh, int swapit) +@@ -1467,31 +1869,234 @@ + if(swapit) + swap_goodfs(fs); + if(fwrite(fs, BLOCKSIZE, nbblocks, fh) < nbblocks) +- pexit("output filesystem image"); ++ perror_msg_and_die("output filesystem image"); + if(swapit) + swap_badfs(fs); + } + ++/* device table entries take the form of: ++ ++ /dev/mem c 640 0 0 1 1 0 0 - ++ ++ type can be one of: ++ f A regular file ++ d Directory ++ c Character special device file ++ b Block special device file ++ p Fifo (named pipe) ++ ++ I don't bother with symlinks (permissions are irrelevant), hard ++ links (special cases of regular files), or sockets (why bother). ++ ++ Regular files must exist in the target root directory. If a char, ++ block, fifo, or directory does not exist, it will be created. ++*/ ++static int interpret_table_entry(filesystem *fs, char *line) ++{ ++ char type, *name = NULL, *tmp, *dir, *bname; ++ unsigned long mode = 0755, uid = 0, gid = 0, major = 0, minor = 0; ++ unsigned long start = 0, increment = 1, count = 0; ++ inode *entry; ++ uint32 nod, parent; ++ ++ if (sscanf (line, "%" SCANF_PREFIX "s %c %lo %lu %lu %lu %lu %lu %lu %lu", ++ SCANF_STRING(name), &type, &mode, &uid, &gid, &major, &minor, ++ &start, &increment, &count) < 0) ++ { ++ return 1; ++ } ++ ++ if (!strcmp(name, "/")) { ++ error_msg_and_die("Device table entries require absolute paths"); ++ } ++ ++ /* Check if this file already exists... */ ++ switch (type) { ++ case 'd': ++ mode |= S_IFDIR; ++ break; ++ case 'f': ++ mode |= S_IFREG; ++ break; ++ case 'p': ++ mode |= S_IFIFO; ++ break; ++ case 'c': ++ mode |= S_IFCHR; ++ break; ++ case 'b': ++ mode |= S_IFBLK; ++ break; ++ default: ++ error_msg_and_die("Unsupported file type"); ++ } ++ nod = 0; ++ if (count==0) ++ nod = find_path(fs, EXT2_ROOT_INO, name); ++ if (nod) { ++ /* Ok, we just need to fixup an existing entry ++ * and we will be all done... */ ++ entry = get_nod(fs, nod); ++ entry->i_uid = uid; ++ entry->i_gid = gid; ++ entry->i_mode = mode; ++ if (major) { ++ dev_t rdev = makedev(major, minor); ++ ((uint8*)entry->i_block)[0] = (rdev & 0xff); ++ ((uint8*)entry->i_block)[1] = (rdev >> 8); ++ } ++ } else { ++ /* Try and find our parent now */ ++ tmp = xstrdup(name); ++ dir = dirname(tmp); ++ parent = find_path(fs, EXT2_ROOT_INO, dir); ++ free(tmp); ++ if (!parent) { ++ error_msg ("skipping device_table entry '%s': no parent directory!", name); ++ free(name); ++ return 1; ++ } ++ ++ tmp = xstrdup(name); ++ bname = xstrdup(basename(tmp)); ++ free(tmp); ++ switch (type) { ++ case 'd': ++ mkdir_fs(fs, parent, bname, mode|FM_IFDIR, uid, gid, time(NULL)); ++ break; ++ case 'f': ++#if 0 ++ { ++ // This is a bit odd.. This will try to include ++ // the file of the same name from your _build_ ++ // system... Probably a very bad idea.... ++ struct stat st; ++ FILE *fh = xfopen(name, "r"); ++ lstat(name, &st); ++ mkfile_fs(fs, parent, bname, mode|FM_IFREG, st.st_size, fh, uid, gid, st.st_ctime); ++ fclose(fh); ++ } ++#else ++ error_msg("ignoring entry %s", name); ++#endif ++ break; ++ case 'p': ++ error_msg("ignoring entry %s", name); ++ break; ++ case 'c': ++ case 'b': ++ if (count > 0) { ++ dev_t rdev; ++ char *dname; ++ unsigned long i; ++ for (i = start; i < count; i++) { ++ asprintf(&dname, "%s%lu", bname, i); ++ nod = find_path(fs, EXT2_ROOT_INO, dname); ++ if (nod) { ++ /* We just need to fixup an existing entry */ ++ entry = get_nod(fs, nod); ++ } else { ++ nod = alloc_nod(fs); ++ add2dir(fs, parent, nod, dname, mode, uid, gid, time(NULL)); ++ entry = get_nod(fs, nod); ++ } ++ entry->i_uid = uid; ++ entry->i_gid = gid; ++ entry->i_mode = mode; ++ rdev = makedev(major, minor + (i * increment - start)); ++ ((uint8*)entry->i_block)[0] = (rdev & 0xff); ++ ((uint8*)entry->i_block)[1] = (rdev >> 8); ++ free(dname); ++ } ++ } else { ++ dev_t rdev = makedev(major, minor); ++ nod = alloc_nod(fs); ++ add2dir(fs, parent, nod, bname, mode, uid, gid, time(NULL)); ++ entry = get_nod(fs, nod); ++ ((uint8*)entry->i_block)[0] = (rdev & 0xff); ++ ((uint8*)entry->i_block)[1] = (rdev >> 8); ++ } ++ break; ++ default: ++ error_msg_and_die("Unsupported file type"); ++ } ++ free(bname); ++ } ++ free(name); ++ return 0; ++} ++ ++static int parse_device_table(filesystem *root, FILE * file) ++{ ++ char *line; ++ int status = 0; ++ size_t length = 0; ++ ++ /* Turn off squash, since we must ensure that values ++ * entered via the device table are not squashed */ ++ squash_uids = 0; ++ squash_perms = 0; ++ ++ /* Looks ok so far. The general plan now is to read in one ++ * line at a time, check for leading comment delimiters ('#'), ++ * then try and parse the line as a device table. If we fail ++ * to parse things, try and help the poor fool to fix their ++ * device table with a useful error msg... */ ++ line = NULL; ++ while (getline(&line, &length, file) != -1) { ++ /* First trim off any whitespace */ ++ int len = strlen(line); ++ ++ /* trim trailing whitespace */ ++ while (len > 0 && isspace(line[len - 1])) ++ line[--len] = '\0'; ++ /* trim leading whitespace */ ++ memmove(line, &line[strspn(line, " \n\r\t\v")], len); ++ ++ /* How long are we after trimming? */ ++ len = strlen(line); ++ ++ /* If this is NOT a comment line, try to interpret it */ ++ if (len && *line != '#') { ++ if (interpret_table_entry(root, line)) ++ status = 1; ++ } ++ ++ free(line); ++ line = NULL; ++ } ++ fclose(file); ++ ++ return status; ++} ++ ++/* ++Local Variables: ++c-file-style: "linux" ++c-basic-offset: 4 ++tab-width: 4 ++End: ++*/ ++ + void showhelp(void) + { + fprintf(stderr, "Usage: %s [options] image\n" + "Create an ext2 filesystem image from directories/files\n\n" +- " -x image Use this image as a starting point\n" +- " -d directory Add this directory as source\n" +- " -f file Add nodes (e.g. devices) from this spec file\n" +- " -b blocks Size in blocks\n" +- " -i inodes Number of inodes\n" +- " -r reserved Number of reserved blocks\n" +- " -g path Generate a block map file for this path\n" +- " -e value Fill unallocated blocks with value\n" +- " -z Make files with holes\n" +- " -v Print resulting filesystem structure\n" +- " -h Show this help\n\n" +- "Example of spec file:\n" +- "drwx /dev\n" +- "crw- 10,190 /dev/lcd\n" +- "brw- 1,0 /dev/ram0\n\n" +- "Report bugs to xavier.bestel@free.fr\n", argv0); ++ " -x image Use this image as a starting point\n" ++ " -d directory Add this directory as source\n" ++ " -b blocks Size in blocks\n" ++ " -i inodes Number of inodes\n" ++ " -r reserved Number of reserved blocks\n" ++ " -g path Generate a block map file for this path\n" ++ " -e value Fill unallocated blocks with value\n" ++ " -z Make files with holes\n" ++ " -D,-f Use the named FILE as a device table file\n" ++ " -q Squash permissions and owners making all files be owned by root\n" ++ " -U Squash owners making all files be owned by root\n" ++ " -P Squash permissions on all files\n" ++ " -v Print resulting filesystem structure\n" ++ " -h Show this help\n\n" ++ "Report bugs to xavier.bestel@free.fr\n", app_name); + } + + #define MAX_DOPT 128 +@@ -1521,21 +2126,17 @@ + filesystem *fs; + int i; + int c; ++ struct stat sb; ++ FILE *devtable = NULL; + +- argv0 = argv[0]; +- if(argc <= 1) +- { +- showhelp(); +- exit(1); +- } +- while((c = getopt(argc, argv, "x:f:d:b:i:r:g:e:zvh")) != EOF) ++ app_name = argv[0]; ++ while((c = getopt(argc, argv, "x:d:b:i:r:g:e:zvhD:f:qUP")) != EOF) + switch(c) + { + case 'x': + fsin = optarg; + break; + case 'd': +- case 'f': + dopt[didx++] = optarg; + break; + case 'b': +@@ -1556,6 +2157,24 @@ + case 'z': + holes = 1; + break; ++ case 'f': ++ case 'D': ++ devtable = xfopen(optarg, "r"); ++ if (fstat(fileno(devtable), &sb) < 0) ++ perror_msg_and_die(optarg); ++ if (sb.st_size < 10) ++ error_msg_and_die("%s: not a proper device table file", optarg); ++ break; ++ case 'q': ++ squash_uids = 1; ++ squash_perms = 1; ++ break; ++ case 'U': ++ squash_uids = 1; ++ break; ++ case 'P': ++ squash_perms = 1; ++ break; + case 'v': + verbose = 1; + break; +@@ -1566,16 +2185,14 @@ + exit(1); + } + if(optind < (argc - 1)) +- errexit("too many arguments"); ++ error_msg_and_die("too many arguments"); + if(optind == (argc - 1)) + fsout = argv[optind]; + if(fsin) + { + if(strcmp(fsin, "-")) + { +- FILE * fh = fopen(fsin, "r"); +- if(!fh) +- pexit(fsin); ++ FILE * fh = xfopen(fsin, "r"); + fs = load_fs(fh, bigendian); + fclose(fh); + } +@@ -1585,7 +2202,7 @@ + else + { + if(nbblocks == -1) +- errexit("filesystem size unspecified"); ++ error_msg_and_die("filesystem size unspecified"); + if(nbinodes == -1) + nbinodes = nbblocks * BLOCKSIZE / rndup(BYTES_PER_INODE, BLOCKSIZE); + if(nbresrvd == -1) +@@ -1595,35 +2212,30 @@ + for(i = 0; i < didx; i++) + { + struct stat st; +- FILE *fh; + char *pdir; + stat(dopt[i], &st); + switch(st.st_mode & S_IFMT) + { +- case S_IFREG: +- if(!(fh = fopen(dopt[i], "r"))) +- pexit(dopt[i]); +- add2fs_from_file(fs, EXT2_ROOT_INO, fh); +- fclose(fh); +- break; + case S_IFDIR: + if(!(pdir = getcwd(0, GETCWD_SIZE))) +- pexit(dopt[i]); ++ perror_msg_and_die(dopt[i]); + if(chdir(dopt[i]) < 0) +- pexit(dopt[i]); ++ perror_msg_and_die(dopt[i]); + add2fs_from_dir(fs, EXT2_ROOT_INO); + if(chdir(pdir) < 0) +- pexit(pdir); ++ perror_msg_and_die(pdir); + free(pdir); + break; + default: +- errexit("%s in neither a file nor a directory", dopt[i]); ++ error_msg_and_die("%s is neither a file nor a directory", dopt[i]); + } + } + if(emptyval) + for(i = 1; i < fs->sb.s_blocks_count; i++) +- if(!allocated(fs->bbm, i)) ++ if(!allocated(GRP_GET_BLOCK_BITMAP(fs,i),GRP_BBM_OFFSET(fs,i))) + memset(get_blk(fs, i), emptyval, BLOCKSIZE); ++ if(devtable) ++ parse_device_table(fs, devtable); + if(verbose) + print_fs(fs); + for(i = 0; i < gidx; i++) +@@ -1633,21 +2245,18 @@ + char *p; + FILE *fh; + if(!(nod = find_path(fs, EXT2_ROOT_INO, gopt[i]))) +- errexit("path %s not found in filesystem", gopt[i]); ++ error_msg_and_die("path %s not found in filesystem", gopt[i]); + while((p = strchr(gopt[i], '/'))) + *p = '_'; + snprintf(fname, MAX_FILENAME-1, "%s.blk", gopt[i]); +- if(!(fh = fopen(fname, "w"))) +- pexit(fname); ++ fh = xfopen(fname, "w"); + fprintf(fh, "%d:", get_nod(fs, nod)->i_size); + flist_blocks(fs, nod, fh); + fclose(fh); + } + if(strcmp(fsout, "-")) + { +- FILE * fh = fopen(fsout, "w"); +- if(!fh) +- pexit(fsout); ++ FILE * fh = xfopen(fsout, "w"); + dump_fs(fs, fh, bigendian); + fclose(fh); + } +diff -urN genext2fs-1.3.orig/test-mount.sh genext2fs-1.3/test-mount.sh +--- genext2fs-1.3.orig/test-mount.sh 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/test-mount.sh 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,96 @@ ++#!/bin/sh ++set -e ++ ++cleanup () { ++ set +e ++ umount mnt 2>/dev/null ++ rm -rf mnt ext2.img lsout fout test 2>/dev/null ++} ++ ++# dtest - Uses the -d directory option of genext2fs ++# Creates an image with a file of given size and verifies it ++# Usage: dtest file-size number-of-blocks ++dtest () { ++ size=$1; blocks=$2;fname=$size ++ echo "Testing with file of size $size " ++ mkdir -p test ++ cd test ++ dd if=/dev/zero of=file.$1 bs=1 count=$size ++ cd .. ++ ./genext2fs -b $blocks -d test ext2.img ++ md5=`md5sum ext2.img | cut -f1 -d " "` ++ if ! /sbin/e2fsck -fn ext2.img ; then ++ echo "fsck failed" ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ mkdir -p mnt ++ if ! mount -t ext2 -o loop ext2.img mnt; then ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ if (! [ -f mnt/file.$fname ]) || \ ++ [ $fname != "`ls -al mnt | grep file.$fname |awk '{print $5}'`" ] ; then ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ echo PASSED "(md5 checksum for the image: $md5)" ++ cleanup ++} ++ ++# ftest - Uses the -f spec-file option of genext2fs ++# Creates an image with the devices mentioned in the given spec ++# file and verifies it ++# Usage: ftest spec-file number-of-blocks ++ftest () { ++ fname=$1; blocks=$2; ++ echo "Testing with devices file $fname" ++ ./genext2fs -b $blocks -f $fname ext2.img ++ md5=`md5sum ext2.img | cut -f 1 -d " "` ++ if ! /sbin/e2fsck -fn ext2.img ; then ++ echo "fsck failed" ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ mkdir -p mnt ++ if ! mount -t ext2 -o loop ext2.img mnt; then ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ if ! [ -d mnt/dev ] ; then ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ cat dev.txt | grep ^[bc] | \ ++ awk '{print $1substr($1,2)substr($1,2),$2,$3}'| \ ++ sort -d -k3.6 > fout ++ ls -al mnt/dev | grep ^[bc] | \ ++ awk '{ print $1,$5$6,"/dev/"$10}' | \ ++ sort -d -k3.6 > lsout ++ if ! diff fout lsout ; then ++ echo FAILED ++ cleanup ++ exit 1 ++ fi ++ echo PASSED "(md5 checksum for the image: $md5)" ++ cleanup ++} ++ ++dtest 0 4096 ++dtest 0 8193 ++dtest 0 8194 ++dtest 1 4096 ++dtest 12288 4096 ++dtest 274432 4096 ++dtest 8388608 9000 ++dtest 16777216 20000 ++ ++ftest dev.txt 4096 ++ ++exit 0 +diff -urN genext2fs-1.3.orig/test.sh genext2fs-1.3/test.sh +--- genext2fs-1.3.orig/test.sh 1969-12-31 17:00:00.000000000 -0700 ++++ genext2fs-1.3/test.sh 2003-04-21 01:41:42.000000000 -0600 +@@ -0,0 +1,53 @@ ++#!/bin/sh ++set -e ++ ++# dtest - Uses the -d directory option of genext2fs ++# Creates an image with a file of given size and verifies it ++# Usage: dtest file-size number-of-blocks correct-checksum ++dtest () { ++ size=$1; blocks=$2; checksum=$3 ++ echo "Testing with file of size $size " ++ mkdir -p test ++ cd test ++ dd if=/dev/zero of=file.$1 bs=1 count=$size ++ cd .. ++ ./genext2fs -b $blocks -d test ext2.img ++ md5=`md5sum ext2.img | cut -d" " -f1` ++ rm -rf ext2.img test ++ if [ $md5 == $checksum ] ; then ++ echo PASSED ++ else ++ echo FAILED ++ exit 1 ++ fi ++} ++ ++# ftest - Uses the -f spec-file option of genext2fs ++# Creates an image with the devices mentioned in the given spec ++# file and verifies it ++# Usage: ftest spec-file number-of-blocks correct-checksum ++ftest () { ++ fname=$1; blocks=$2; checksum=$3 ++ echo "Testing with devices file $fname" ++ ./genext2fs -b $blocks -f $fname ext2.img ++ md5=`md5sum ext2.img | cut -d" " -f1` ++ rm -rf ext2.img ++ if [ $md5 == $checksum ] ; then ++ echo PASSED ++ else ++ echo FAILED ++ exit 1 ++ fi ++} ++ ++dtest 0 4096 491a43ab93c2e5c186c9f1f72d88e5c5 ++dtest 0 8193 6289224f0b7f151994479ba156c43505 ++dtest 0 8194 3272c43c25e8d0c3768935861a643a65 ++dtest 1 4096 5ee24486d33af88c63080b09d8cadfb5 ++dtest 12288 4096 494498364defdc27b2770d1f9c1e3387 ++dtest 274432 4096 65c4bd8d30bf563fa5434119a12abff1 ++dtest 8388608 9000 9a49b0461ee236b7fd7c452fb6a1f2dc ++dtest 16777216 20000 91e16429c901b68d30f783263f0611b7 ++ ++ftest dev.txt 4096 921ee9343b0759e16ad8d979d7dd16ec ++exit 0 diff --git a/obsolete-buildroot/sources/hotplug.patch b/obsolete-buildroot/sources/hotplug.patch new file mode 100644 index 0000000000..22c356b227 --- /dev/null +++ b/obsolete-buildroot/sources/hotplug.patch @@ -0,0 +1,33 @@ +diff -urN diethotplug-0.4.orig/pci.c diethotplug-0.4/pci.c +--- diethotplug-0.4.orig/pci.c Wed Jan 9 13:57:29 2002 ++++ diethotplug-0.4/pci.c Wed Jan 30 22:35:24 2002 +@@ -68,8 +68,8 @@ + } + + /* check that the class matches */ +- class_temp = pci_module_map[i].class_mask & pci_class; +- if (pci_module_map[i].class != class_temp) { ++ class_temp = (pci_module_map[i].class ^ pci_class) & pci_module_map[i].class_mask; ++ if (class_temp != 0) { + dbg ("class mask check failed %x != %x", + pci_module_map[i].class, class_temp); + continue; +--- diethotplug-0.4/Makefile.orig Wed Jan 9 14:28:05 2002 ++++ diethotplug-0.4/Makefile Mon Jul 8 07:29:00 2002 +@@ -135,13 +135,13 @@ + + # Rules on how to create the generated header files + usb_modules.h: +- perl convert_usb.pl < /lib/modules/$(KERNEL_VERSION)/modules.usbmap > $@ ++ perl convert_usb.pl < $(TARGET_DIR)/lib/modules/$(KERNEL_VERSION)/modules.usbmap > $@ + + pci_modules.h: +- perl convert_pci.pl < /lib/modules/$(KERNEL_VERSION)/modules.pcimap > $@ ++ perl convert_pci.pl < $(TARGET_DIR)/lib/modules/$(KERNEL_VERSION)/modules.pcimap > $@ + + ieee1394_modules.h: +- perl convert_ieee1394.pl < /lib/modules/$(KERNEL_VERSION)/modules.ieee1394map > $@ ++ perl convert_ieee1394.pl < $(TARGET_DIR)/lib/modules/$(KERNEL_VERSION)/modules.ieee1394map > $@ + + hotplug_version.h: + @echo \#define HOTPLUG_VERSION \"$(VERSION)\" > $@ diff --git a/obsolete-buildroot/sources/i386-gcc-soft-float.patch b/obsolete-buildroot/sources/i386-gcc-soft-float.patch new file mode 100644 index 0000000000..97501087e2 --- /dev/null +++ b/obsolete-buildroot/sources/i386-gcc-soft-float.patch @@ -0,0 +1,61 @@ +diff -urN gcc-3.3.2-orig/gcc/config/i386/i386.h gcc-3.3.2/gcc/config/i386/i386.h +--- gcc-3.3.2-orig/gcc/config/i386/i386.h 2003-06-25 16:18:31.000000000 -0500 ++++ gcc-3.3.2/gcc/config/i386/i386.h 2003-10-22 01:46:57.000000000 -0500 +@@ -653,6 +653,7 @@ + /* Define for XFmode or TFmode extended real floating point support. + The XFmode is specified by i386 ABI, while TFmode may be faster + due to alignment and simplifications in the address calculations. */ ++#if 0 + #define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : 96) + #define MAX_LONG_DOUBLE_TYPE_SIZE 128 + #ifdef __x86_64__ +@@ -660,6 +661,17 @@ + #else + #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96 + #endif ++#else ++ /* Set up for x86 soft float with 64-bit long doubles, since that's ++ * all the soft float emulation supports. */ ++#define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : (TARGET_80387 ? 96 : 64)) ++#define MAX_LONG_DOUBLE_TYPE_SIZE 128 ++#ifdef __x86_64__ ++#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 ++#else ++#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE (TARGET_80387 ? 96 : 64) ++#endif ++#endif + + /* Set the value of FLT_EVAL_METHOD in float.h. When using only the + FPU, assume that the fpcw is set to extended precision; when using +diff -urN gcc-3.3.2-orig/gcc/config/t-linux gcc-3.3.2/gcc/config/t-linux +--- gcc-3.3.2-orig/gcc/config/t-linux-uclibc 2003-06-04 11:56:11.000000000 -0500 ++++ gcc-3.3.2/gcc/config/t-linux-uclibc 2003-10-22 01:46:39.000000000 -0500 +@@ -21,3 +21,28 @@ + LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c + LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h ++ ++############################################## ++# We want fine grained libraries, so use the new code to build the ++# floating point emulation libraries. ++FPBIT = fp-bit.c ++DPBIT = dp-bit.c ++ ++#LIB2FUNCS_EXTRA = xp-bit.c ++ ++dp-bit.c: $(srcdir)/config/fp-bit.c ++ echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c ++ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c ++ echo '#endif' >> dp-bit.c ++ cat $(srcdir)/config/fp-bit.c >> dp-bit.c ++ ++fp-bit.c: $(srcdir)/config/fp-bit.c ++ echo '#define FLOAT' > fp-bit.c ++ echo '#ifdef __LITTLE_ENDIAN__' >> fp-bit.c ++ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>fp-bit.c ++ echo '#endif' >> fp-bit.c ++ cat $(srcdir)/config/fp-bit.c >> fp-bit.c ++ ++#MULTILIB_OPTIONS = msoft-float ++#MULTILIB_DIRNAMES = soft-float ++ diff --git a/obsolete-buildroot/sources/iptables-openwrt-extensions.patch b/obsolete-buildroot/sources/iptables-openwrt-extensions.patch new file mode 100644 index 0000000000..717db7d70c --- /dev/null +++ b/obsolete-buildroot/sources/iptables-openwrt-extensions.patch @@ -0,0 +1,21 @@ +--- iptables-1.2.9/extensions/Makefile 2003-10-16 02:34:36.000000000 -0500 ++++ iptables-openwrt/extensions/Makefile 2004-01-29 12:03:41.000000000 -0600 +@@ -5,12 +5,14 @@ + # header files are present in the include/linux directory of this iptables + # package (HW) + # +-PF_EXT_SLIB:=ah connlimit connmark conntrack dscp ecn esp helper icmp iprange length limit mac mark multiport owner physdev pkttype realm rpc standard state tcp tcpmss tos ttl udp unclean CLASSIFY CONNMARK DNAT DSCP ECN LOG MARK MASQUERADE MIRROR NETMAP NOTRACK REDIRECT REJECT SAME SNAT TARPIT TCPMSS TOS TRACE TTL ULOG +-PF6_EXT_SLIB:=eui64 hl icmpv6 length limit mac mark multiport owner standard tcp udp HL LOG MARK TRACE ++#PF_EXT_SLIB:=ah connlimit connmark conntrack dscp ecn esp helper icmp iprange length limit mac mark multiport owner physdev pkttype realm rpc standard state tcp tcpmss tos ttl udp unclean CLASSIFY CONNMARK DNAT DSCP ECN LOG MARK MASQUERADE MIRROR NETMAP NOTRACK REDIRECT REJECT SAME SNAT TARPIT TCPMSS TOS TRACE TTL ULOG ++PF_EXT_SLIB:=icmp iprange mark multiport standard state tcp udp DNAT LOG MARK MASQUERADE REDIRECT REJECT SNAT TCPMSS ++#PF6_EXT_SLIB:=eui64 hl icmpv6 length limit mac mark multiport owner standard tcp udp HL LOG MARK TRACE ++#PF6_EXT_SLIB:=eui64 icmpv6 mark standard tcp udp LOG + + # Optionals +-PF_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T))) +-PF6_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test6),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T))) ++# PF_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T))) ++# PF6_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test6),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T))) + + PF_EXT_SLIB+=$(PF_EXT_SLIB_OPTS) + PF6_EXT_SLIB+=$(PF6_EXT_SLIB_OPTS) diff --git a/obsolete-buildroot/sources/kernel-patches/001-patch-2.4.26-pre5.bz2 b/obsolete-buildroot/sources/kernel-patches/001-patch-2.4.26-pre5.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..aa934c5a7ccc977f0de7b46654e41f94376ad0ae GIT binary patch literal 729361 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

5i+EN)s1dVcT&YGNj6mw_ceQdym)DqG_v0A zJ#2sSuxL7|D6ttq(bV{=YyMikO`~ZdzfIPUV64id>2p%w6ZhkP6UHua2yLc6{`2sG zvA26zg|Zq6J)EZ8!x}+|A^)}VR##E?RGWE%GY5UuNyW=){-Pa9&%aR3t!+GHUu3&G zll8fco_fyH5}DB6QWyWK>0^3HHsSfJ3rdHhk2cM-e099MG+QQX|NnR`_5?%<(TU*@ zbv!11GH$%i=}G9G79KOIV9q5KRi^4%CH*jC^wmo^=*$PQH9g}bDf&xv2&zI3>ZkuT z3*o8P7l@lsU_xfV9j>{`4EqKg{k|l>69Si39MY!ryD2K#Ce*4z3hJ4JV zI?Xq|?h>`#W?S+eoK4>X^+^x2F1ZfA75AO=4N}4 zp;J39*wHqEzj)~-!~f#M-A;~aCW z<8i%yYfG9ys3((-t|$Fz=5!Zm<#n`CC|oJ>*$jSoKF&PPS!b5n;~O{=8%a0PTTFgz z*Q}>Y&A<8e%Kn#2AoS2G*ZJs# z0?N6TBED=IU-fpGlKmQCjgko$#*af$fw!BNM;s63-H2KfL$cxzo?mTG!~XB^&XO;L zTHy|b$U8f@&Vv7Z980yc;v=n4bc|rx4Mu;2VCU+8Gi5nbtfgf zy`;x9=zWWYgC52v<~?@OF8=$EiQO2=&&I$71*HFa;IUS?n^mr|N@Z_ZaywB%S zw{B#8!(}Kg7?^R<>t?p{bc0LNPLcl}0gM`ohRr|cTUdTNCSy1cINU2ZT za}6X{_{Zh^m5wv;Tr`Nt#BK17Voyr(KRg;qVJ1?wILwat*)t=)|Lwmo_Ac~TzWx8N z{cQv1eB=L(PYz8m?Ud2h;=bA;0)MT`Qj#dcv~Msol8`#<@7xz7vRafFpYBS+K1 z#^VX!I8L8s8o=B3^4arxmwtUdhcHy`cGoulqW|W%s>aM82>+KYa0}XmJv3j1Pp)>R z&2Q?10w2;N*mvXA$Vo55mmx#_Yfk)Apv#%~K>FayzcvApP`y5?Aq^@rtt2W)N41ki zi2ZP;`EAAyi_Y&6sdQrFNmgRqboEKnrc@fvI&1{ljL9_3%DexIuYaqzre0mQD`gdp zWLDai7RuXYsI;tN#$~~_=FsU@DHdaNJPcYrt~xvv7+REC{`H4D6|NH^ur)e&-+cF! z&SkX()xzaQMN$gM^LrlUib_!F0uVaW!+X@DvL-T~oE_JSJJl7(WTUEq<#n248PL@| z3OKQ0l`Cd`dLg4(A4GDmjoh>v6j4P*4|K7@9N$&OFjL?^ep|iC>tYEO*W31Twx}wZ zazEHEuTL1mxqEb+eQoT^LS`p=YyWg+CnI zS>x^cto3n|Ul*A+gj3&Y3PqyK)^hm~zsVO^ zx%czEB5}V&f(|Lhx-gwe60gZ>RbKV2Xw>U1{7ryHh5M9GWk?x>`z*K}81 z+nmK*&f=MJ=#l=rnvC0n+qEP|pOwz0KEqeKcIH|6S?sbDM~ z&}DU^GyjjL-ydGDH=PNBiY%2mSN6*5{xCj_e64tVRgo@KtH)0OSaBDoZTYMhS8AH?`zU#Q=Ya-BRZ#F6sFd+O z@960EvbJ%!#_>6XwiGIYF+Oy?Xp6%o7U?gq@&6ak_0#`GpEu^D%T}L-5mBd9E2Xen zRR72RfBShrBb#02`>SY4ZBXQEU4Ik)RQ_w78PQ9qG4?NpqTQ@(s-wR<1d`1|Ay|?!dg&_PA-Rb6uJ|=i3_1?dU;_uvmy1dPI(~oRUDY2xi=23dH%8}_{BeLP;X6k zQLSUPA6lnFc8^&lM9omH)dK-kkDet9)z>UD4-YBXLB0u4 z-H!YkTzvo5@oz4j_{NM`trZ#YdpjM_V7J3(JjHH31qqh#y5hRlN6atx)XGeId1%%c5fohX?)zhe(vnO zaeJV41USPT4p83oGES)zvN;)13L+uF-9-eW`ROE&x9s@A{{0P*hi2N-66Rqqyj^#3 z2woI%iW?~=+9A`kprqbBf3wgi;SxY2YlAtVO=UZza4g3MzQFH|up2=u&zNp$3-dj2 zPbC=2_y!6+f@?p2oc~KFp6w67Wa?&m4~>DK%?!_n@p-^5^QGkZnx34VZXO%K5jpVq zNv|-XSwoT=Z^rX|`u!Sz9WS9iY%+Qq@@3&~Qufh0)2fu?6(lhnj{fu0Twpk@r4(Je zs}}5(P>h)&r9iPzatNS>Wxc#KbMU#iWTR_V$ zd*oHp@q=r~^RfHL_r)px?rhKI#l(I6`&J@5bj)_AW=ITtSSaRT!<|js=MB5ZNT&BW z;~DX&0u{lF*r*ai_(>83`hoksJ?Z(i<*e(R4YbMjW`c(O)HouE7ygR^iREc6yvJSV z&qSwpNYZNItiCRV37||n7T`Kj=B2H(W#XCh{m~zkDmhNP?=ZIH2uy9-MonUJiWC*A zf&=q7co14+1vzfdv@?iqmn=n!dU7w#o7A*hVMD&@S|<)paBsIT5i1ruLe;a%D>pK6 zE*_#CmK?W+q*hOatM`@@=K4NZhj?#yZF}oWo7OD$lv57{Pk&%F5S+lGB~o;rpvWe#EUg;W zby#%>woNe9?F}A)4x}Q1+owCITT2pW&IW0rV!*VXCx0^cUl%R%Su9lUs&^X1V^N_ojB9(YoA8@_{*SZp zzJKU<$LQk&P+WS;3kgI;S5&i)CMXaT33_`W%V(Eu2!bYA{@1tq{IC`EAN*_Ze%sRa z%_Vc97|O@8CHtlS@D{HvdoP z;;tZ??Wg;1`)uu;zwfRQ*&RG-Dj_GWK#IjdI#+_66wN&-cM8Fmqtd_2#6oI<8J*#% zJ1DcOOv^Va9dKUQ0cX_{<+T!?? z4<^OtYLOYx@{t!&wrLa~hGjK4-7@|~nmQ6lK=(gYT%Jtb7EYsfTAN`aIW|#8tU?xc z`KvrsAvL0&P~rJG_v11inOf1DscdrC-(R9{xR8usX0cAHA2;i$JsH~T&-vF4(%GXJ z@zk}p9h^Wd`Upr!+4jLElDFW-4MjbnfhHFJL8RYj7@Hl+>(Zz6AIJC+DB5%+jJBFR zB48j-1Sk4_|HO3gzOS6C3rbdBvco4W;@Y)}W%qqPuaD1rZC@5Po~a)WUECKa)Z>bq zuC5MUj#Yug!y7F0Uj8dO_Rzy$lH2L=o&5FXBt+ZMnMl6430_T-fa8aBM<_bfH zD$GeMw=Id>4ium9#LdwPKDU%WI%Bjt6va=&!^3dxr4gl+6a1Qpv)?G6G)N@Gr%vdE zh!8osa6!p6x0;+2lvd^!D5{n29vd&wEOoCh&zI<(=@Xd6z+pWOnF$s2yh>`EJSO6? zB*wMoshiel<$zYde7IMtX~o^lm4XMR5Y#Oo--`46WiJ_U*k zDp;lt?Ph zTVXg2{a~o%vHu+7t1$<0sL8W(THb6Fh4Vlu9w0z$+O9Jt4IWv+VtU z$1<%6Gd>-$4$58qT%oAGQ+xywAd?1uiu>>2*42M2B5br*6>Im?j>Ec^%GoMQd$%!L zoRe7ld#N=tjdN~Y-D1&b(P|`^EPMVQqH!k7u`?1zw!SsIk< zX2rEIuq}i6yg3}7Z*$4wJT3d$;kPR|rGLLL`m=xbB|yBrQRF=>ch3_orRx{Dg;t%f zYf0642SJdGr}~x;qGHZJek`gXf79BD5=8Uo-IgxgM~Exu*DdY>C*f)Rh0*!rQ(W$Y zWRd?t3XUYoje7kck8EKteK}4UWJ52rL!SKF@0zw*k4MC_r;;%(aO;m=@%wS;K|V6y zQs)=KTc0xX*V&RLxPI`@G|sw-uX1?7tg(>fPw{`r|8AUUD0qI(Yx^AiU)4D}SxqJK zi&97aFhWEuA`(ZUJFP24AYL>wqsPXlIZ~pPiY&m8s^?y);%#!Ntztl^Ry4NaOkPtC zJ!$B#M@>F|ZsB{8RA==NeJUTGpYW^38jpnS>GR<)prGqI{+=?fAFDI9_Ue7m zA;CPqN)%rxH$tRhZ;XV}eTO7%{aqg>6NUDXEc_y20v1-Rlqv^hT0c)1HH$_+#GWDe z#5Br8-yi6o`F|~ImR_A7$UhVJef}Lk++9}LV+by3|I^I0+G!-NPDxUtCQr`gig?z+ zp+d5TQFX8NbhXQutw?bDBMbNO((n>$1)|rOcL-+j=>4-$eAaciY9qn(&GWm;ge5h> zPDmR}$N4jagdR{UH~1Bi7vrdIP;y^u!hgfR!_q$rP_s`Q_(i|Bd^xI#Ru zsPd)ki|pT0?e*WU%kfLpZ@aiJ-RqJVqQWV3P2A*Ss)(p&l_M?VHL%IcgG+hkCv4cB z#u~8hzUMSY;$w_RxiRREac9*uLFb4wKf_N}=WjRNZ8S2edCf(KCNgQHO*AzW$b|Zx z&6q^_S6ka-xhbZ9d;C=I-$6HAuj=Q217-8~zDw871oas)6-9r-G(v!8&6IQ5tj-c;xT?pPI=BwlB>^2az4DI_H0Ff0P3_hdB62BsHp9 zh0U0=h7wO0C$K}V0sDVAtU{^Ppq#``9<&9m}J zj7@gA)w@eYS7}>arK4Q4UE1YWX&7NiO43l2Ei{p!pkzoTBwo{Iy6v=DjkjyA3cE{Y zmd!Oy*GYBCb#qEqX<6Yy*oKWVvM^<2OpKbj|2W8`!cZ81EhIwHD#~d}NT}3Rgpf)| zkVuUL65`T9?23(Gq~xWAf`cTiED{wbD`dc#MivMKRvCnu))rDSK@}u53d>^F$`3dO*F*Pj7ExKRZeBb)OqP} zVztKq3>kz^0u#Qw|!fROCvM5-<%xk3z~A(Hn)Ck}}Z>ZU?ZnvjOL zfqC}oBR(KGSR4A@hV8(NPpSzy)EW^q|K;H+)Iw29zS5XRSk(0BjQ>c6h!0{Pz^0pj zS9RFjk6-bANV6*nQ#xuLH^lWr%+Tqbv55}VL`p5(|EhR)P@l1{}j ztD@!GAH(R3l}#_t;;R!BOKpi~7CqmakT{c!f-)^dnF@*kdqe#Qc0&}&C3qhi{}22( z{#5LN?jn1j{};4CO!fyLn?#un8vN?Fe09?NYxcbB@LKaci(i^2+4Is|L-%P&8{laO z#SQQrLHiXFF(7a}s+6Ps8U8T$*2(fmL{UXm6;NN>^ULQ9{gI(GNd{ooLe|m_2~=AS%`|Q?O!)qq`2x`C;yUx{8rV&`_#zg}=h|{;EsOfuwZ{XcYt%TrBI(=;d^# zs){Q_d#89wHq)U9N!@?j>g3?4OHNMNzhn@URl`v{^C~QPYsyuzRxP_?@Sp()j&1!P z=zj-#y+hxRedMR_*OaRJ?)u1f|7&>}RYXy1V2R{gNgX3mMHg1tOX%VFyTO9>X`)Gk zw~x*AZ|m$e{S4b9x|nBIH+I|717>vPb#h6s!g6|Mq89{H{iGK(>g=LIp|%yRwu~zx z#aUS@K}ihB@<B&b}CVcdcrP|Ec}W zhGt2E+1)EsL^XPjBD7BJ=P0L96OM=>=$O)_BPC%m{wx)timu$8%!q9JlR}7%sw}W& z=|(m6Cd7?Vj&u&ll`0m^o+8sbB7jLrS2Q;iPcVqO4FY{&r?JERLZm+S0BRURR}pI+PKoBR+YbHP`Sm)i z(j4~Zp^!(uCUzZQQzd(H&Q6{Wr8tc-yofe9*b+%wTeYAQW`&--*iM2Z#s81uz~|4i z1w1))`9Z=WPY|Mar<$8X0b0n|Q_GVz>W{7tVW#Hk*q`OU_sCipR>$g$fi9ic5*vQD z@1S3{A3kE8mNAbk=o(5SItyTYn+!gdfn=(mx0KPJ*V0$#@~7>61q8pk4_Fku(YW}JUCx$ zm9Yv{0aQzs6Zt4_P~(BYcoE$Vgc2#*9z2nZ&Q3N6gkUaBP>EkHuRagI1&r!ZgYK93 z=u{A7PboUdo+XDnPKf?1$cVvD-~8X@+*F=Y`XN4yY6g)~pZkiL^N#uD5FrISNXf7# zD4{{b=rH>S@9?L4Vv!Ol?K27^9*3HdPJWSSX6OxD2`RuFslg$=)2@dKNIN zL?I4^C>2yt@G)(Sn<**y(L^B#1S2GUe-q)n*DsN?tGlq0Mq^^9b!8p+#*85slvmQl zwTy*S|C7M_7^7oRQ}Db9gWjSkSAQ2PM45Zfsfz55jBh%@-}du4>htcAT7cj0r_tU0 znPAQsiKIe9(GbdI5d0zYL#}UqkYoaS{hWH?Uq{5U$ZCppM0!MG57YuF?t0^o1u z__YneH=M~9?0%@9B++!*H|lbN(V;#Y*>sswZ(+T0wnX}?^w&DIXj+5KSdYO-q&^%h zS@n4E%`A*yT16o9w*Oc4 zaW5}Ux`z4Vog_}FmpQc2tXkzw6*RX#rjB3Hzq@B@_I5Z zn|K_Q2>bOE!W=;6>A`*)Vy5Sq_)dIyX@#`&g)v5SRNW!G7_Hi;~AtpuS$Qsw_>yoz}gqXG-54eB#LxNv$S$(>qQYBg-U&Tu^ z7w4yV@;76U<4lC%qK_4~1Btq1gc8;LAJO=LZ)v%+Hidf6c$vn z9-rU$Ua${_TWn$M{dRneQ=b+Cz_>Liu|D3^Q?|2+9S~xOiNe?AY!G6wR2bY3aW>jAeX(^f{-dU~i*73EA#^^P${ILj81ocCjhEt<> ziwcuo>f`1yMB5J@=C;RiQ7Q7=2J5A$kbxw_T-&}~Zb?|%9NjchRm_-VlNz?ggC29u zetmsB%L{!|y#I5&*Ys|mvFF$A>8CvlVe=9eEZZ4SSg=Gheq5M`5{RA_6mZ9soke+R zMB#}m3H%OB!>v&TMRSuO1hY(G%qyCd?}fq9fz(H-D+7(GO2v(`QBq0_D*+JV1!e{x zl^|D)lk>TePR2s8D+%d6iJl4L1qzXUyHQRI1q?9iLo>&sKP0kotxph@hEzlm50Xja z)FH+S8Iqg3PaNat%6j^9{mJPX^Sv7>6z5Rs9Iy9c;ffMNyTFQr)&j~t#nf9i6C{&b z{MwnAL54&mgTgrF(_h_*1tYPCPyAn!KeA6Kzv#T-R?%e7eju7^PfmM^A{_i2L((Q$ z(c$0xoE{TW?6}=QY14vh=Hg`&nwb=XttwZaioRYSlb=hqi?8GVI2^vxandhKc=R35 znghum{TtTS23hp7s_2vB4re1&CNv2owUR*wq_Iwpdulo>(Mt5=oSQ<ngNsw@H zkyKViEml=fwftTV!#7OX>1+aU()y)6ru}y86m)^HlMq(F!!7w~OSdRCje_@EM@$I! z+?ZltTrMM2f2+AyH$8+E0D_>R(?v;|qz+x1kHcC-B-EfbLd}r!g8Tbx*%OJYQc3-@ z^YP`vV=@U21g7elJ3qpkGo|xOVF|_Sruh|huF-zibYDZHF|5C%+mS9Q9dc)U65+JL zxfJ&(j}?&n%3|wDTX3;)z8|95CN1Z-i#NL|EiI}E13a6BJg_KFWfVOMQmy!@8O}+qhUUqxM0t#mpLEJP_abiVSphFG2jr-5*DPvo*`p7#rI-hzh-eqo|0A ziOr(?^RX*H@%kNhcD}dyuUu+;|9q;dGBW?e^VbjAvh&bVMUV*zB#=TmaOD1Xg(jT+ ztNLQUqDv99FYMvjLSH{A#QxLp{NCEb{L@X;5+Negk&$(cN}o(Eh}-@OmpFKzIQ`=J zrU$XvEa2CnQ{bLo-5;H_V+9|DwEb6mIVY6ieHQb$r+J2$DrWjm0ta!DUOYgQw+Pb0 zkr=G#pUi^E^21pKA;Ob5t;&MA!2OZW&!6l6PjdaxJ<&ej_`jNemH%pi;s^UJ|7oD5 z;T?f_{&K9X*9xMk+OY2_#a&?nqSI3f)~_BT^8J6?Uz6^+B$HdSZO@YFfJIb5P0Y%& z>i&@FUxM9&dk$}B_V!yx-pneMsC-2f`%hYr;;>Y(xxb^<_vvG=OCLMNLD*teii;Q! zdHpCI5Sq%2r}uw7`1O1Z3Wvc*jW<0cBlt`nKMwt|O{VsUNaH#@3LSrKoj0;SjK$TO zQfDl9zqj|_ehSCyZAysNI?YxmV&%ondE)WjAh@PCkmBh|Vw%%_yADinVM4O9wHCD# z01DSiFlcekDj&p|7W1dP?ANwTFegb577MK8tSMZ7VN|6bz{-l8lQCm59UFEqH;(LzcygG^YNqDV^dyuAUtU_92;$N5p>mdCxJre;2O) zw8~H02Z+yIpOw$-$s3+?I{yA5Gxv6!%je1^C@W|4Gh2 zL+_JDYAN)%>3k}(9AL%Mb&Wh9Y|3BfM6ZGGCkh@P@QyyG>&@i&esGG1tX$#hf47_dUi$6kmxtrn z=d1Bv`qV-pZ>Yv%yR4^Q%I}}`>UzbJzrLUE?t8k=i(2NVSa)5~bI*?zUl(t#9V10% ze*V+DyjBWP*EsgNJL%gU>siH-gzNS17@rCqc_%|tDkbMS)|hO62sQG@3#DT8QFgAc z-3eEnIO7#rX^XxCH}R$t)25zkd@DkYIRA_-rr%=JShc@1*+}1RcUe*N|4&{!EAnyr zJ}ge(Pn)RjccP9aSKo)-y87NyN4&$-N%py-aFjCi@a2r9T05Gf2#QeADVs+YdAAv| zq^a8HeC_k+p4zTAo+_xsZ(9E71Kj}q0RW5#{_1n30OwxMBL@+zX>CTZhfA+fWYpsF@KFUcTBvY=WX}f~ahOd~3Y3%N6T}Q4gjm zoKQNm^x5J;SMtS8VuEeYOHy+CH4lAnMexZHJS=|NgxZH%gQw}kHNbv8%rEMlQWNF4 zq?>5*g~#CszD6;68a{)+ELYHu&sXuOEq-aw-{92jMd?&31gS`>XK4>#s#5B@)*Ph~ z^YWm@dF>$(kPqb9|ILYBdLN!E$_RfnG=d%nWF__QJ3U+|Y6#s#jj|L?}x2<={fnMVF!ki!FPNe?&1c2oXxt;$EBp8}8NnPdxq~&ixm`_8))Q`98*dJygmZqK=_*!j=x=0}P^JSZ02-B*R)| zlB@=FBSbd|tQXkl`8PN5t!h{_n@kn%{Js98wXu;?P!^vz20J}6fnu_V9nxXzFKii3 zw8fqUf9qMD(hzo^aRwXW;T;=pKheK-7}kkqx_`>!COf+gtRP%FOA0QAp(Om+`24w_ zAj$f4>>UnrkcazZdba1Ez(SXqE}^CWOVi zQ*wwEdQ!cD)JvtUpo>TF6A>8-%v?@;k~FA>#i$+w@ukNkpzef1<;+b>%2@i|bM{$* z6fZ!xOpSTtTxJnd@}xf;e`x;@`0>Kul}u^4^-r@KwLl;#s< z7T2$jW@lM6dWMcApX@mgz;f7RMijvf(vsls0uSmOBT+-SfK*hb37k~UOjTx4!x*xl z{!FM0Lpw4cS~p2Zq)cg^Tl8GB?53D~!tg3;bA*ye{X=t9tNanD`wz$xLu}w77qyw2 zzYO&PCAC>lUhgA`jnUFH8URYd z*DrNZOiR_0L#6e&<@aM=+L#e`nFu{YL)rp!k~1gqvqHz|X7AR+!!{ioFomfvfaFTm z20>7vKQ}(Zn_3)1&VQ*4R2QfFzkKB{x`s|;*(1gTBNPaqYDFVg{$F%G>X&b}O9KZ| zptLC|2OSd2ND?*`9mL^4GJg;0Z!uA{+MuS=0LZ|qpr-zdFepwZHwA1=6NJh&`?;rtLYZ;E4=Ym|Q? zqNW0wT#ic$VW_-IiQs+r{8)`-Ng_uuFv(_tTnStPoREYjbAjy9r@0kFpcXmk}iCl%!Q*6?FM;u4*4^moc zB1Xi(ZH`Zq*}R)Cud{>2yLGZ^B2s%{B#+a5$&Ean8-t~ZIHw9nH9{QYZZS&vyHNUj zI{w}pP=bHkPhVc|!ifb%5+_Rj&06pe{IWFsPs~ycFg@l7(lnoTPvkM<@i1#&XR^S{ zIs(!o#EZR%=Q@w_<#G@X4$C&d(xU)S?mvLTYag3Gs)GW++Bu>|hen4*nEYR1ynzT5 zM-Q+RMky@(Y>0&ck_-w*Md4T%)i^A*sChyTkW&nf!z^iy3H_3S7J(-z6q!5Jf)ECa zBwYcu^?SY-@-U484`~0)xQ=1xeJ0Vth=}U+l=nmZwz&u8|FqW7%qv4YWA>d`CLg*r z3rvJJrTP8U=vkH=yiEdcyvx9Ik^zVEe|swN(CqY^4JXZ9H)D1+v;7LHRhFg1^9C0F z(+^RzDSZue%E%b|&y5l{`@eWnR1aSu5Zo%lKiWzLD(C~vQV3c0JMs=?jfzP@gAdF~ zetiNv287Hk%}!R`S^O|^058f zdFZiB(Ss8riu}^~d+NVE<=MP(j8eay>S?FF$)=TDIkl^5zZa*)wOvoHe%}dKIXlJg z{}{o0l;I_4jqwO4Eb@)<>1tt9O<;ofxF?QoQadhS^9g(L%tl`QJ_q|m({9W&hyaiP zKcWi1kksw{dMv0&_Xos#HoN+`t-?>V-MUM`L^<|X1nPpE{Uk%OdEw}Ph#fghLRIn_$R3%jTS(VfL-Fi#! z%8z1I8A|V@*>|gQJ-4 z(MQ1%R1m2of}UA{AW%?-6ru;q-qs|7Am)O`R2BP8tB0OtCBml3e}^%j?fhmG5e|b` zj%pDt31B&K=o!G>NM?d`{|=wRve4z_96!-Sg}Eh&772GZrXqggl952MLTOSEbyV0} z&bqw+bdO!A$K_ggCiG6iFk=0KppjofhS5;Ugc*Z{1j`192hw{O_pQ2#P=UaX!sF-5 zhDRkLBl04K*g#^r8+=Of!}GYoXz2)PLLZ1DgomtCc0bBv8>!w1zt|9k_ZP2nH`}SCwT^kt=&)1N5tB5urfZ0srCfYlpgx~Hdq_jYgb0}X357&ZE#T+`0&z8A z(vNb6mWj3l{6(*Ri!n|NF6sZ zjoYh@&h2+UsYR;lr9mx_s8*{m)J86hI1(l&@%sGN*}e7bgKu{=zllDth~7yfYa$wW z?Kqp3sceO+w!tuz%z^tKYyMa;-^)D!>1+V3WcSsEuk0|h2XX}%8;;*jM6hILkzGKP%8#Hnn_Eb zju;~fZ?_aX^<>khDGvxDA}XrfZGXZ29|!oi)_Z3z8PiJxhz9*g$gE8z+{>VmAgfCg zST$8|`Hht0cvRJ;GmBQX(TPP>wh9&`9ZKw7e$f%4Y}!CNWEFO3elz@E?EY)13vL zA$1#SQ2#;n19W*pqID6V+X}{_QjCl~JUjzz)IDr2 zfx*cE)CwTWC|Xnahi=mJIBdVJm36D;G{rgyZEZxMZMKr9#DfZYu=Hd`%UTWVX(8Z$ITu_?hvZeuV^D%rMFX-k8r z@?LVmv+j^@$mT~aEmc)jRaII`X)Rkl%xqhJ)A>Cgko^5UdKwEGL+u&$=QORYDn$mZ zlG+q1wh2omy4#61vXr*cmX^|6^3xchftbSb+y~EZsVt(WQJtO$dG_ob@o6d{Q4tuW z9$CMJ9^Z))ZV>CKUy>P};aFO-Q%$-n*$G zW-JOp06HxT4k70PEG0MsL=u)B7{2F_^mDZD9!Y6nh%B-(ynzyE$}lSeuRARi@M(R0 znR2bkE0+i!$lZlic%Qwim&5*lZ_yi2#VDcsu^Bq9Ztv}t{_L#w(QN+Rm>ijPspYpi zbyps_Z~T7eHamV*3|?Qp_gwn!qYj28xx6et#CG;Ii&Q=n^X%pJT22a`Dm2axc>m(q zV;Xro8&^j$80c_uP>PPJL6*vPlbBd2qdIsOaG3-w+3Iury8qA8-c?72$A6mY59mdC z?kg9yL%td6za}ce(=zh>h>3fZEQWCVPQSx!s8LeQ>ciFQdhfPS9dMyJ>X{W2hMcUmf-lQPL?wADC zXsMxuPD+|no1w>|E|Z~ve($7&4|PK+Lm>jDyL_D>s8pnX>YF7K))GZ5Z~0S%h$Odb zdT#$Z8`|}2r-ycp{PyW7WU+2hKabqo;AkH;*7OzBY=ZQz)j`N9$>K5nNTqz`!z$9g zKCO!zJHOfBr%YPXojWvY+SG7eYYGvmSr6w)P0c<^8Ad2)p_Q9KPeoFZwxpB_F6bk2 z(0f-Y!k9f*d;jON!i%aYH6*RFOKQsRrt5z#9oAuGsGF4n|10r=Px>}}!m*x)!Peax z^5)iFjAF1pt(P;>?Ot^Yh_=gC(Jv^~(49v}} zs0**8>$<*pb7It9b`E5xeI>i8>_;1^Vad~~XSH*EwxH@87h-I@?F~-c`A%>q}Qm@pKIpvO1qekIi(_Q80j_jc;Mbx5@46 z>bxX1HXWF&l~K5a$28}MY{W>4g`HAzC+6Lr93E?L(OZ$hYwNNpXrc;CRxwn4n1@A+ zhw#5DCS2b##&+!@AI{8v%v%EdkagQv37g#GhojURL8NWRV_$c^Nn+7rV=1`!xdoey zkp5|(gla!8yA%EElb)$F+eG_b+7bIxT3<2~{ew`GVOwJGn_(8}DL9v@HBSZDEeka} zGRnqMrYEz#xf$DJ|E57KDG3seeIsZjrus{I!|<;xRiFk(iE4a zKh==R!0t^fEWv_g4kv%2 znIyl}csC-ZaU@)@7)NtsZ&w2&Ac^1_Akrs!^y+Z+=X$#hcNj*HssR1eSUyHc(~~v@ zZo*|4$%$!pW4iQ`og+p#YNqTf8c@cddmka?o{*DRo4y+w+eh#}#>~iLKhwTTR+Sr* z1O$gp-n(`*2r&#%)==@&D@VVtYp#tw3MhD(+-ec0fti_RK}9Y^Hl3=OwGfivWG(E$ z%Fof)y)xSGX46L$4IUepy~`<*Pm*L6g9Qj10~`f>LrVzsq6K9Ku&C$T+!|>hM61wB z8cStQwrGeU$X!yeb=(Ump8&puB2QCNrh>$)`l;Ad7ih#`Sj7J<9|&+Lpkjn@0V16&k~}@<*CnM{vqi8KfmEce^=nI@+1QU3yy8$D!Ey`dz^Y73hrT2 zcBzOdL5XOTrr@+f{1Hi#&0>>DF6HMK&8K^0Q`%>-GA;ou36Pbuc z9hMx#;o_y(!pb2eT)XQoLV9#(HJZwd=I1noIPRk{NUb?~xVdumSfz_0?aS6Oqgm1x zN6Sn?hqUi867>e5)*lk`DTj-DRf@c7q`cpcIql)iy4Q|-tLZqrDam}-%f-lYy{Sto z>Eu`w(#|RhN;2@49X^yKT->^WHj|T^QwX}e8SueZov$4XMGOOon*+isunF%~M>L@Y zqAIK;04E|-K423%VfKH#96rS7w1-pStlV{!!EpQd#EDdpR|Z1Odp7a5-TZjnO*GR@ zBx4xHG}BEq(@iwJeS3oEke;pua$|{!p#3tbZP3`@$eI+}N$t0DcvOAbb!aO#8xJ50 z$52sVsD`ie4S~r=2d6pm2E$4xtgubTy&zlsOHJ$n1pmBO|A?TTTGEm&MGr(O9U|ZFT*zcI30cNwEQ88% zm4VSv+L?E|sO!!A$?bKKA&g5)R;*+}2fvVc{?PCAJ7lVpytA~R@cT|2B$7ysqS!@M zUNijD_aKh3`(yLI$oMr&+_-nDe%seBrnt+b6BZ&wR=l&>N&C6a zQ`9f~)|c@3*F0h;^trNcN+Xg~LQ5Et|AE@ce%o{H{>SEf2T7!lrI=q|js*NFw(|Jj5_(?>+~G zo^I)YGk=B9#rD?`XB#c_D=+r8TB?p*};H$9aqp5`Aa}^d(!_RR<48_n-QM*2%=JTFKOzkZ_ zb{6AM?a%6FbX0DNq@6Q4Je!U;z@RJ^9AWbK@WI~#giq=yreq)jCEWvUCd4RsOx7vE zM_uMFe}bONAL+l2>i+gV%N{44^ifM6DP7O6gHDR)J_`A7|30~yjE-5!?T*`*X}$i~ zLh!eh0)-ERJpdRq65b;O_OWnCWL}mN)~9SO9PCjYMP7(7gZiBkmDjh3YcN9{+{Fcf zwtU=hfm#Y0ZZKnmK~>Vm>^S>mhd)$)D$H98 z>o7n^n+OO(`ww^yn{?KMDCQwIDb8I62Sf^aY38X62m}!Y3$Td*nvif{bayD(3KM+M zR|9a|ffMy7QdJ?*D~4qM^yHo$bIEJcX*B3JnBg-K?CP^4BIX!&LjnOHW294Vl~@(p zR49mBf}hIzjFgoYw&n_w5vM^xUZX|TP@@AJ6)Da$;6=;QSCm9mh1y7{vm>~`z^ds? zxW)lVs8GDWc}W6`!)u~I#(njUqN>k~i%KJYCM7Yqd!C{N!k=MHQ!FgdZ;Y!u>O}o{ zAyhnVsm_+8v9NDN@oavFwd`*8{oenww@9#0*Oeh}BwfQrBZxE>%}N_^pqft3hZ<<2 zD8PtG2yh?KAEJo-{~7)NmVPr8ij|3j75DzE^89}2$(9{7EZIWqtP`{9^|`l?!uLNi z>x<1_M7cpuZ(cz_vtD*pkMRQnhiiZ}EZqLT#gTuQ$TEUfR=!Sdv84`D=0qC~Q8A65 z$*^+lqsIH~_J<;l6#Z-4d_5L_rBUkrr>iP0hBfA;S?$76(cXHu^|K`8LiiN)##TS+ z;i$eI#?x__X>;klm)j|dbQRA#6{h!QrLIrxa&>TcowqVE;8VCad5sNSrXM`+Ep#G) z_hWnhXCHH!xr88~y79-#L(*gpL*#x0p!xP?p#hv5pl|H_y~|{KtJp>m|AW@BJ`Y;L zWrwLpHwK{7X$L4|z&HK|k6BJPZnoMI5Ph`c@sl_%=kq?-l0AJfH%Di;i6*(sH$@|% zfOw(BEzFc;vyC%`QTd57W3oTu{qmH)oz7>)!-hZXuVZG*-gTDCIaILvUxRj+3o7E_ zW)$=>=IO|9UZ*x57}(eovMgk#dT(WpbS_bQ0O8cCQX8nsr0>w++uV%Ikfon>bPW$}b-i)Z_(~m}omf@bK&I^%l zbX{vcdX&j?(?r)HxGsyU)TR+AgTlB@$VNHvtvWp&!uIs=tkv=9=wke%rRH(IwOIG# zzF)i>(sOwCN&a~$X$MxX0T*{sk=See`lxm`lmV0 zbDZd+iYTIrD5CRzy*!B!yd4tjuDS#v2w{zbGZpDwVRB|(8##DnRHAZmHt2yDAr^v4 z1$9%@w9!;nH?MZjp1h^Vr-L0Qfw{rd0aL2zAnLiLh(oC0A8Uu6laFy{)#>zq3{k9c z>b$du1sgWx!K9j8x6LK;z9?Af7BOPQfdUK|FkweCh;#BGgWheTCB?~W`IVOw80l1r zF;`ITrn^Rs4QrR%GiJJ389eJ+Qr8cZ9lnRqa2#>M54=bcJ&0}*MK1`2DZJGKL674w zOfib3X=<$of@B1k#%J8|1|rxFCf7h=a|)i#Me@aN6$T0CkB?GS+q?L~pCCcPq{sdk7}3ZoN~z+HYrJ%Hn^|f)deWLay&blrmusNRm>NJ}VneGG zySVkV@Tky3nfYEup;T1H%@$&p8|DL2m!PUvwiQx>=PV$!f(&EZUbs=5$HA5D^=BEJ zgyCbGf<4dgJ$uxf^Z_4dX}%B_dA9!CF~)CIlnNN7(@+N8oAcN>5<~^Vn?Erl9WIMxz%j zsZNj$$1XL@>D1A<+sOln@KDsujtin~#ws(bDvE(2-P+q6Ate6hS%;>-mz<69O&q+vwM?UE5HYR`y$>gjS=mTLM4+QgNiv?BRdQGwM0L^v1B#*(s) zQP+E_M5k7-oI>VMsl`#0FW50OV_B8TA$iS_K^x8IaZF-l3^!XHPmSrSB5Ju2EBUhH68LvNsgqmzZE;3PdqTfFjzuPMk&F3+1{A2t3@Nz0HJ7f&iTr# zFHsYS#xppbVJLYsbEzqU%M;V$pHZ2@eOx+133C%EI+PUf(Dvq0X=}Hfw(jhA&YP=g z*Uwb;;k?Elez#d(!$ORw&Ms`y9SG2!HK#-(aQW6DYO|_@@oFtBL@|cOWPDVqL_3Cb z_X^yMA>}-vn01XBnoyCKicVz|v3j?8B3+{DF*giSV+dF^iJf8y!KX0-&R63!kp(-i!%d~oU9cDPAWu2=1HqpF|5w1Q~^k9cg3s_##EwF0$_v@ zPj`qL0>p_s%G5&Ele*EcZ_)?oJxk^&>HcIWB>z~%!SV=v4_B(amcAy3&+3FfpMx0J z^nGXFh{xKckaYCJtdr275;{yzwvP5JN!RS_jN~C(N$rk6Zf)JV^lQJ!j zwaGXhl>Hu>)vov(VY_7%F!9j>_+h=pn6m?Af641UXXfNOh?!F1(&s7fIV=e%s9X#e zpJs}o#SP4OxF5iNkL*Uz^5eH7UO$tR=(4Pnj7(M=^G$&p|7w3+C>T(f`A%u0SY=N01y2(;Pj30D??Kd_xDQybK z8GyFZvLY;s5UEfh!~-A)bpY>C?WbOH*^q(^0NS)@qNxJ1C8U%A(%7p;3+VhKT zTWZ<^CiHOhQgTDko|yyDX(d31f-N`}HpA08hc>Np+MRW^&5LxZirViy)H!5_EV5%* z04WKQ1XYqzA(V{7#4RGIN}^26lTEBS$yN=dIKk&M0r0*Y=X7{xOTQ0XAqA37^stqZ z`Z!uCk&E)@vB^=Z!lZ4sOo|1mGAdP@rm@$_9&5BKvil=c-90l|U- zZ!j?~9AHR9NSSccbt|LO$Fse#cv-ikn0lvq$J-{u_di)H>?7+KA7A!T2M8ZD$Ql$B8)BsxMB;NGO6x$ZWAXzW_dLy+$MApN_d-)XC*YwP>pcjqAEsg!&ctcsB0j-HKZcR|ZFasCEu{ z2YC-y^^cI~KcLz^y@wk@h$_Cb%+v@Sfv9>jFm{cN`ZfpdvEg5_=GO(Kev|bS_NV53 zk0Yy-bw;1gK|dr;pGUD1{J*$E<1_0kHU5JAh^m#L>C|=`i4`!Xq&YRJS=l-Bi9jQY zfgAQb7wtb_){2D;10gSezvYqkRs48#$Z@egrR%kL-3+xm+=)m{DFxoag**ilm^|4>4gSjQ1Tc*GJeS{YX@2T=#~hO6aqr{ zn#S`K(i?)9Uj0i{LJID%axsfJ?j&;vr6W=j;2?!Of)te;X&l$Y9O71KgL0gVjgE}` zwAISXRqE#OSG(NL=)>&ggNP~VQ8td<=3GM|-$6nuDPs9XJxpG}h>;d=mI$LAw`K14Dd~_k_AwD!! zUEG>!B%jCXsvYVor9MJcY(7VE$T9u2i8`p-zky+a0-?evC7Xur60l@W+92` z%ASg^IrH^MJQk!w_LEh94Ub{gWn$&wm^AyE9mjcw`!{rc!>f0-$i-G;6~Ws^-K+Y4 zHp$$tV{=c!Kef}W`Z?o*)B)URXD*V+;H~$xHZ1vK; zS+e+7haK08=lJxD@xl@sPmIP`vjf;@9HS!YMyTeXcj ztu=ROHVPKWeTQI0*YZ!q7e8!8@`0CN3QuFjwqSJ z!>b`)A^ay&Cg>%_;aG*0digR{Uem$c8L;m1C3%u24EV2+&wuj|^$&dyc<%eY13|cW z8>IVwL&dlo2zHS>I*4jz;=i;8%UEW89fcmlX0k;d;zQ%9uxld?<^&>_i6J^g2vWpC zj2O%ZDHJraD@Yp0dXV)3c34!!xMC)T=@ajHllwPMvuwjWmLK!vRZGrg247Rm3(4R@*=~p6(w+Y*@L5*S? zQ8BI~d#3wvRztU>l1a3e(`)BjI`7|W=||3wCg!n*6!Vp|ou+t8Fd2Fi=^o z3vAb0ZMLnp+ikYnQ&0Js4HKLoj1nYv{NF$5ygf%I7?o0$F^p8Il|>XN5kO%SQN}sF z=QXB1GBlmuV>+rP>e-pCw%cv`ZJ9w3b3qVx+U#muclMf|bn&MGl&Vsl{qK^q-{Z#e z@N-pugy#R3U%&eK%`BbO`o8BgblKU8s;IG6F}i+ye#HD3<-D9jPe;l!Zm;0cJ_mK4 zT2T5Iih1&8C7Xoq)JOGu(0n9@ApsQ*djn(T@C=>-Mnm`qe@)-nr=-~BApwweAZ$5y z6w7k_GY#1KjzZ@Vu;tX8IW9f+{bL8-eVw?e1yEH{MYGXsqC(*<0vkvNIOGjwrNVOR z`BO<}!FpNU&6)f##dB9ew>{aZKbm7_QezaU*y|q6B+qJNf^gC=8I&LDWSK(6}@Nbn8{iqr=j?6$65WH&n#!-Ro=1CX*7G04{tBf%aO=X>M4g&Uc`RtQjIP?;?np zT*r@)n4ywOtHPqS7y1#v_8q6I*UEN_LjXw$={F7Bi$G{U&GzTZPUGeu{BZ6RPB@x}!?#w|3Ph?S0T(bXRL%Gyt@HCSV0=J?Mh zvD>qve{aM`k@SM2AaW>`snkGm#^N5V{g9Hnvi&e)(ohH2c%PV?5C0!^WcCpfY42tf z-&&w5!U^Sp<;=vtBJNV=sM^>Ah5ytaW3>2qeQA$T8i8>F@pVbttK01djT5K37Q@z=e zp%pwHLy;8I)fY1g2XQ+QnG2c=V5XJ+Gp?%-a^?ce)5~&eAjKt0zb|;4%+JFi+&stT z2kRRQ$PoO7%>ocwssC&Ds;a7|@*^0PQmgD^6Jdotw{%sR6AH%q6@<7FN$U}E`JZ9w zm=uD7DO9KOKSB1L$FQ!h&PJH0tW!-TbTnaGFwd*Yk2^m4S?>CW;PxBO({``S3>@-JZLz8IT-Q?MyzgZ|EE-IUfOARL-JIR>(t{83p4741i86f>)_wu zEEl5=imr{$c#G-<6LD9(lnMU*AHa`-{KT{*5y(K2&$1G z1yToE@yG7O>_iaL{jxp&ROsHSyqf(=v4KD$iJIDA^bn^<_Zh+wW@gZ5O^I5@b84!p zqKYCH+3JYNU}18qs_Qw2q1Csvt@hvKs{RSQz2>k}3Pt+v>XiJYR1yr6@m9w3K5`)A zusz%l8Ot=wKAR4KkWUI^4~7eF!y$fIOK@oSVU(9v~tBE0yTa{jYLSzD<=pXMtmE<$Qcjc zv9cEkDp63n$3gOL7MD%{`j~8& zM$!UZG9s0awUM*b=!YuI`jxe(`O(|L3BNmob)`xg1```bupWE&Kc-_E^}owRLkquC zeTCHGSdX#Mw{tu`n4?N@5Rs(3p^_);|DSY6xWMWR_6sFc!Dx*L{QBhK`MWWB>ul25 zD9m&@%i(=Nn*_;|ePEx)bicPSwh!7fiNgyw?p>_J4m;amacV<9YH;1B3h0b-)Km^k zC2gA^iKLy~Yqx<&u3`;Hrl@I3OT{_Pc$b+ZP^P6)k!0APh2ddEYfZUoT;e1S^+`8L zyAVdkBtIG(6+PfI%s&0iTz@ys=PmrI*?A3yy#j;a5;$`~7$?>tghB9EB#?EFRw0a7 zcp=Zu8iw$W57HJ8Nt%`?+-7FtEJlvTuv;!em%yVO`iM0Mw29J6mInvlSUkhnK*;b^ z4tqIARy<#pXZ#rn6bl;126WdBPv7buQMQlu-g7Ktww zA5EmW7OuW(yCd?oJ0nzTSDQ`dl~C#mLL#0&wEX)=1~go9pW@{~6rdtyz`e^nfnr1; z4XuL?DdFZj3qX=(NgygPM?48BqO$ zvS?MLQ={~mMf4<{6>d{-QxTTJ2kL+1yt*?dNGQK&O*NIPLKcEmf7twuI8hQ%RsGQ2 zm%e?f;S#cyXGJk&^hov;khFojVM)UR1m#)&9RWfcQB9|f=`%E)NgFGhq}&xo0m44_ zJq>&;`ncbowarCRHwh1cSj0<#(z3FUttL!>#bPET4>dMq{4cTb9_~#h-pKawGRdbkhOsM5;h{FRgF@VISr@g!{8eAJ*-ZF?2e<0+V2BbYM5ef4DeG;06cWcjx(IpUzv7-X6aV4y3X6h=50bLNX&I6F4B0 zGqCVU4$>@z`;Hydc|C6eo`Xr3_S$(mU5NLE!Wu~#!X$7)C9IMMfujZH>dOd#M}$HJ zk&(@hoY7<%9w|>=Pg1~4vK}9tJIUp0X385VbN93Y4 z_`WUQyb)uuX`|q1|B3dR5o3g(ryqQJosFzmP~(W`LX8p<2a&4FT}I$PZfZlUcDW4oIHcX z!>r(4^l2F2bw><3zhaZ1P+Zo5O($W#3cqb{A*@-q)rZ+(&?sVfj0LK6;(GOpIeK4* zl?1z~CsM^!wM4GIfRrK8sb1tFG*<|oP}GxD*eDIxKt!OZ>lKK8zP8q-C#nra1ribW zG$OSdfUM;~49}=7U`<}-{$mrZ0K@+ zXwNW-8kHt<=W*QoIQJVH*)@;4*;Eke7p3}N#`BXo!F}Z+a zNicEYW4a2EWMM>BTE#LLVZX$qB2@(d_BQ1Ex=-!tTsI2`dGbTc;o4J{0X zkq+ON1C{M{{-+_srtx>go|a5M!5BzcR82uq`Yzf7#b`(jz@VpKa-NTw#3R5FQiG5y zyDjU26s9EsctOIX1jiCZR7W-%X*PVM*`(pS{*Oj{Pa5A_BhD6CDI)q}NUlLLYBIXN!$u1qRM=d!V#yRUg%-%*e})FGStyWMW*Zj z9r6xhs3M3Oy4nL17KJU`zi{P* zU|h@;pCdeSowhZ`oSf&IOjqYqqvDU^#_gxUQ(g{-GXaqm6f-Jw?FbMj&GIlaI&qOf z*KQ5rRum9XUcnjC=n9)Z8jLm3$# z6x5O2Uc^F-7LMInVF|P{sH zD+V|@AU2~`g{Vd?&^ZDYogzRuczQ0&ch|7(AXrtX#D9cBr7&e)1(}npcSx`4Q%;+t zWOmn8WGP`%kfJF&i}rI9DL~w|6YR5rFtDWrV9^*0KiT-}JWFH&ySp99r6d)qSSF6K zqZsx9PsH_o_;nlR1?3M(RpI`b%DCp4WNJvmw>N3FKGXH7fZhns5 z28r<_WxvP5)?$F%jgtjrP(_gdM2KJI?J+s2D5e=!MDiJk!o4j8A)l7cjte%*@O04k zH+@^l)2+P@hsdVG(@#!%+B;xsMvDSxZUPSYQQ~esSaLDvf8SfrOxDq|)iJcLhXjTLD7dgxj<6>%sBtj!#Ivxu!P{cFqHr~QHcA8k@9>=sO z;ZK9WjG6V6+#vfQMpRoBJ9_-_oHX`3-xunyYt{Wc=MmHvl|2dRQxzm+X*mt_4jtrD z@S>wxU4dy)GWEl_rhKrkpig-c9t0nTh;uC@%#m zD+|n!6;r^01_U<1rAR$+T8nUYDH9~@+BZZiTd-SHp%ppoYZMcY?!b4r=)DgqdaTBG zrB2M~sCp2kd%9{j`_*0RDB3O+0v5Dx@&{Hy$)@UqAW)iqK~ZxC zZ^xZTmI~BfrGH0Nx{C3_%LlOug=8?C{g3eGofFKd=0L-kuEOGvt<9mhQe?|bKQWWr zRh-FL>?SXTs)k89lY?A~5% zc@?E9;g9vn$+Kp;4LVJqf0z2A`0G$kopL@KD1ejDE}$`UlD}`qe^YjlBuNCPmx*1T z&7Qf9LsDbu4uO#US4N!S{1?2;f<$4Uhbv>MO1!J|on_qWx#NjnQFTD&g9tK{V5E!& z9TaC5`3^AY?!1a(7-JWjYp)flspDKn*|n?WmN{#g1Wkl<#5r+ z?p-lB9uR_@R}oNp-W$8>C8(^J#bgToG9C!zl7aaLE{~4xKSTl8FF_po8ha~ioXq-- z+b^2_P~oH`+siN2KddQ+u?Nl&1+y?O+wbqe`&L5 zLWyw=??uYR+f{_3{K2RVe!;0wRSibkO95Nwtie=U8tgOnvAH>KcSS4RmFjp9(o1IFv#^Byi@|Yf-JMw`U~L`jRgbo>9o3`j zVN&VU_S&8|hrUUv=875vz1|3lD2gj=RB-SMEAQGcZufe>w}gzH5l5M%2xL#_}B6d~pm2@R41LD{op z=@g=3QK|~HoZk8hD@0O?5sxZR-7|qJ4}_w-PCY}EeDkX5qH^_NcjQiFEz%)tTAJ-l zko~aTv43LOf2oB2l5v|Bf+yX6tC~?PijWu9LVp~%2QBbaI8LMO?tO=ukmQqWKcm#4 z)Nm9yl?vmENhPYoV2H|^@y1t(DAuqvxCge|l?whm-e zh}MP$8(B2tU++D>w?;X3^lYA|Gjm7DPjSrTPWKVJqrv`P7drTvp4Wrpoyfo`bU_2if~m?{T-QQ$vG%WEa=LL z$r-fpqf&_)Caed5=9-9vO?VA-#!d=}hETedRanf3NiEEmM~fX{5MD^OUb`s4fv9K* z5UxDQrh6PojtU^(`VD_#9H1-fpQ;W9>>XWv9D$&4hQ>+86`OBcFPV)wE74reu})Zq z4|U7j{N?)rRyPSET^yu&?<801#X#Qt@Km2N^`^jkqa_WqwgdV`>j4;1%W@6IMGx|k z!d6MJY6c?`pQ*gdicJEU0+XQgDl9R`s@+1UApWR7IsH7P=Sj45=OPi?r`)+CvxtN^ zAjw6`NY*+L^GCTc_O(!hWZ`TcLqn8Z5EOl&f=0k0Hroqn1a^CgJ5#7BL`Af7-FTWP$EN2&F&x} zdI^K_h~T`8hCISiazv?JIxG!AEkS_BClQD2Om7s(Mr zPFLeWp1FbO^fG1QT4qhw5r~=Pl~bhUc5Y9E6M0=zNQu5vG-aF ze)6*lMTkAMC4-DoEr_C+lQ2$QdR#0@3Id>@&){jYaxNCQ?r^xSlZ~uIT1JZS($N6w;vDAvqv)b&1pp^xE?kQX<#GXeu>FYlk@)$(Sy^inN?H)wBh=C~aGInt<0zXDD zN$V zD8cM=h@xY!y1SrkP0(Ql_Gi;mkMIej+pDOn|7MLjntzeRn?gn2EmX-V{43Gvyz+FI zWnxqy`smIQd)&I?0jk(>rT^$FM89D-2 zM&&!ik3RSglqLv=^%WrlB9KwS$=p4*<_Jz;KV-I^O*Xk2%QVMV`Mb`9-n)`tUP%2_!_Q- zhJ?#*9>O+>9AU&QLHq;Dxd8MMg9DejQ0zol3!j%5pBuQAqz{3=kvnxHLeWBC!VF7i zT;O9_?+&U_RH;u|P!u6xCIY9?se~RJDJ_YKawH|dYfmzW0;ohcZ8sZAxg94`v+FaW z1k?1EVUNDx*rd2Z#)^?DG$W=rgnb4QqZkm=TI zbfh$!W?#<2lof|92VCT#HhIA9S30C<4|mxxT*3!_J^nIrIU4>dDBM~)XQ0@leQ#+} zB>3rpRcJAYOczzIzua3`p&?=@A}}2T+QiMmmB5oku(Cmud(pxjK|V+Kn96y%W*|qw zAO%IsouU2297vf$mL^tmEx{PT^SFfNYk(yLU}D+}NT0aY29^|oWu=nS!jRF{dFJ4q zK=^#%s9QN{p)3$alE_f^LlugKQA@0{SgQIBoGx(>?b9VNVtxo%Acu1VURW*hw`vL&oy1ZyFFbb?^#5NxIYVi6 z{lBe7fkHx;sczjgZ8RC&M43RMf`@mp#GT_a41~*|ZD_r@v70B22~uz7)7BzF_M(o)zixsza`Pp`DW z1fCDs;HIC)#&C35@kEm?*x5!Sg~Ef5!+m)J7(`@M1K^p5(cn~RuJT8$dyj$Kj&v7L zIe4bQN{kAb5oSSYL`Kp-K$#*;V1}L1MJg0B9I?Rn6ci!?G|YF_Dj`5PG=^n}$&QVO zK^nqGjSNfv0Ksa(d&60eDt>CdAH?cu!Y;T=-~SKY^}RpI>FKV%9G}msf8+i`V-jur z%Ci*A{0TSs@xr&M$xgixU&_~}nm>w^n9oew+vhRWhx>eMfdd_QWl#BpZPz+6s;8&$ z&-UjX6v^9Nwc#7pt75XuREM$SvkPYS*;=-$D_kxA2^W-b|1Hzx(Yp*e7X21$lX4L* zcHDft=USr*9*Q#w!vubq7G7C)Jo@?M3CGbp; z!hlK8gvV2M#3QucQ9YFFLThu%y_APOjaJIc(`b4zVSGKFJ)1kbG_6O!u`oRW-Zs9g zN@qT-x};2lv>>NY#Nq2tQhC##QeA9xO^KRqPcn9$YzBoXI6P|E)3Ba$VHz5Xf8Ss z;DsYxpC@czXKtO5?3^rf_1)}ee?-K3MUOMFou+2q|6O^fcI386wzNkX&<;zbRKbtPRK zBqiqLA5s+wdTA;`z@;ur1fHj(Ul&!D{Y(OCl`V98jOpIXZ?r(rmd z3dc_KRX<=Trn7(Q9YG(umqN7$dfE$c=~_-f6ssI>?`B8$qsc7s>Mt@9QLj`%E1?jM z15RpWOzKN2*%`bA5@>j$NpJL=gaWq^Y;dGZ+Y=AFDf^&(F>{$zjS~@Sc58=oyW8n=|V;e;ZI(ya*D3^Oks#NHK%l9mZdJ zT z8};J#LgBQ9Jp)R$EKr?6c~P)!v#?Sb#Ldys*2&r}A8ts`yRd3lVu1~XJ$sXD2WoJJ zO;mjN(o&R)Fm5?q zQAZ`R)mRsr?^U5M7|+p+Qu{=H(u91(XQG;pbW@W3+4%e1{C!eL000000000000000 z0000000000000000000000000000000000Fx6|nd?>Y8700Hpe03W{RkB2+~&K^C0 z2R%Ii=RKdqJad8Lo;^Hz9OpQ5oZ;^A&H#J8o)2d^&U$zN0000000000@xz?(dU!n! zbDlT=2d6zabH1wiUtRF&c5!v|@JW>O3K+j~F^LDGEFrJfo8)T8bdo5c(hS8#%N-Tl z=!G5q?ELI0DVd4@j>0^?Eoe3MRf7@7QA@<9? z-)8%fKW_#vBLmqxVg25UJn}fsEv`)>1Ia`3-)g)hvH~piF##4h&JxfuV5r1kRY%Y| ze)UacMpB6mA-vZNG>v;t3x~kGoRNuwo82rGAJlj;NAY1xMoE+4k}fPfN)Ft}iYUm% zFPkD#I%4SrTCOJH;ILoe;5Q+Or8$)mDf*i-B9YMVK!)D=pg5(VNE94D9ZVb8xN=UF zt0$Kh2ekfrfV9pbvV+3UM=P9S96FMGxAu}R;%dLwRqCRu6tBBO*UPut)?#K7HJ&PD z;>4&qE6XzfeU%A@aaK_3f`Y+QT7hiX%;^{;1x!`Nhc>S=Qb5q##e9@;+r6xT05$yY zvLWO<8cXTVQCK*rT)Gq&)0IbV@=xj%pBi{HkQOsvijwwN>xMVLb+KwttQ{MN0;lzE z!3*mf4Bb@~q*v>b53;@vO!66Qgv9^T-2rG7RaOeG06ezMALc*D$Kd`CMyKV0y#-}9 z1tSQu=dK6Zd}&0?zK&|5wkE3Jh!6gP12uz!3W|dYfGO3^6{+m*;2vn*TfzdVt*ZI6 z2Qc3BO1>od>!>p}cb%oC!`f6#K#y#3DmwXCk+;0^A~LA__0KvxUIh*Br0!qcg8mP@ z=pJ(g#l&3Cea54_R8iQB<3P{a5OUZI4)6%Pa6_ExV=-G-0x5w_59EJ=)>L~2^^PSL zn<{})sWxzMZp$M(!ws7toj0~Rr=61x>JW+^qIF_79xmvZ# zjAWq2D$9io>UTcRThXq=*mX{LQQF2Uep22~*^Mpu^eqeECD-Ew4evZ1d7p6ox!e_z z#|suZfUKFxEM*4K$0l%DG^R?3gqovORvagU@;Tu3vkSv1>DwUO zhau2*?L$G;L4u(1sQt%QoGIm;l}_9K?q?H`+_Q5GWRCM@9|-o`aFxMMcd^gGVQsZMxYR9tqu{7oTgjx1eNZC# zFws_;?Nx)YYZR{Su|CHiM*~#DB}6Qkz}(t!!jnL$jH@buK8h)(DL0|f|FIi9bkSn1 z+Amr(E%?T{6Pqkz=o=P0SelfJmoh)}3K^j>^^Q3f{1EZ1f*nJIh1b;|Yo6sHfgyG} z%$y^S`^*GzG7ve+Jlv8b5=P{E_*@2w7^4C77f0hnBvX1bz>+pUguCS^I1U1NZIqZ~ zcPD*{rm|XyoINL0@ea-TnZ8b7_h7`h5_N!Cf>yC25H=N9t}0Ir43~gZ%!8DFIc5=n z$j8%+9*2^e4u{kZ++oXUoq%3sF5o17UlT(qx;|k9h4x!w6QWPm={rZ>3G7C5~b>3 zs*$r482pFseIBlM7E!by%v`@{|A6l9?wuA|NPLKgM^5dQsuAcB4T>pW$tE z_NpAb7xllPbxf}Z!TS_srzF^YqF|B@A^`=NlAzJt<54Yi!*)4onbNa#-1s z+Sp|9<%n@a$@}@DmJBk1%%^?U%XnJK%p>=S$#>%29FM{B94YI^z|UQWxO0lS0Y|P! zBrGd0Wj2(#=SmVpTB|?5$rVOs6;mZ;MHeo0(_g#wDJeoD9(Cd_r@tmd;EsZjBw3AI z2-IFISpvk;`;k77SX;nyXRN2+PLvOCpw;#nga}pMb)d*}oADhDD{0PF3}FqL!M63W z)Io!4mT7B8@e|M1c{!FfId*3YIXk~1O9hr;kG&m`vG~S?8Sxfx0g7pAG$z6i5|fLD zZ{f%Ncr)3@=<}kx4Lllyr!kC==?wz=#~{ffD$GDlvvy!YVF*l&7o)^EQ5F+UAJNb= zK(siv*dd1LPZ>CZPdMf1g+f2b5hva--!s&K3n8gyp||I)hhpK!g%|hIzPzYDpE=TB z+=KO?>3ax55Fnav$Fcsv#eC)P*@gd(ntU-;f7F=vpV+sNL?cBV2gD>l z+;7_PUf43=Y}x)r5|y~`znP^JbLzab2IOcGykw!Lc>~aU$s%_b8BHrIuSQl!)=lPd z<#=kbp+oeR&ZF7pVr(L8N)F278(A4XgwP;;ABSSB=V73!5h&xu=MAVo+HwiF)`o(I zB+Lz1#hsm$)be)7;$zrf1bQ3Tjb{2=! z6ir3uaurc3(N1Gj!f;C#Lm9gM>QMtopj2QJC|%a=uE-ZV{WBP&F-t1fbv8PUrNgtK zS8Ft31+WAwDi}l!(i@6H@pQ>10RoIn5fU2aa3x&;%0Qqu7JAByz)?05HZ>ihTLdqI zlKtuR{U6Wha@dmU%t2H^nwLbaWS~Hm$7RAvzb*%;Y$>8hcgC4t*|vo;I0P?YM#_ND ze#2NcU4vOrM|2e)_^Jx&GS%lhm8}x%ir%RezXMc7U#>)p6b|YU$qZOE_7M`Wp{_X_ z`}g7c+5MkqS2-NsrFTiO=&`xYSZ?11*l9d50N_(kxFCH4(xW6m;Y}k#d0?kw85PWf z=zwSJHd;|Jp~TN_RjuE0rOJI*8rg;;I;mUAPuTDyjJsjvz9u^dQ0NqI3|p1xo9&-I z+zAN-{1>UE@h|p`B)1v4jJ11YqruTa6F~-vB>$H&fsx0=ZZ>!2P&&`>vrv5oE-PZB zk|ts(q9~x`FnF7c4cn){)>TmoTUa<^>JY(qmN9Inn6ilQz-4)nVsVLa^irWl|`wT-(CY+e6q_kfE&M5JMWep`@$tHHm;BH}5 zsNlR(G@5=f8yGD6~$9v5fr(;E|3A!{_o5bymS&EQp7WReUf@Q*@IQAe(6 z_Ka8(iWn-A0;Mdvfc`0@;kbYWHBfX(IxClkHcMxF6s&V&N=aOmQ3WC~Y1`QIlBEUX zAaJC-t!S27BSEN8Jt`#0-{0;aoTNj%sKFDNK4Ku8@=qf@FkdDp|fp zXXJ7c6fP|J6_FK0QAi7zrNZ;A?|S?mCr1-cjx^NEYS&gPk57FA)=y(-G^RxcHrW1>Jfkhz0JK=<&$KF$36GzaXWrIIc_ z|7K*;XgJ=|hT^|G34s$rB=g63=7DP}pn#MKaNI=-Lg1$XOup(_n(2jpB}567$Wf}cUgKTGnv6>e@~u==hgqsgt|=f>YET+U85LGF1B*aN!2XV# zxv?n+AE zg5FVDB2p9-AR(X>zu_mko>i!=QFp=AS6L|KC)U<|#)?Zc8iuViL6bmWTXPCIlL}-f zAAZwlnD}$7xo)4MO?$OH#vallNb(>OYdOHV$bd+$h<#tMD_$ncxZ`ZB-ONQ$lVnx)Yi8T~c zeI#IODc8ug(h?hRh&WsyTfnt8_K=#u`j+YO7jd|QmwjZ;iuCZtA?_#&{s){)V0v|a z95TzDP9>pHQPNacXHan@KyNkckz#sCFuZ1ViV0|nC{n3Q6#IXdJgw*A`={%E7Ong+ zWtQ!7;YKo|q_Hn=)p_QLgvLuv_?I?hj1`kfFkfdjfSm$_0kKhg5jqJR>}(>GATgHl z%|r-_=#evKeuHRiY1}Brmw>8MiBXE+DQN+bImH-|qX^jhxT@jNX8z-9T-)M+llJsN z=oY)=w9-l$-FpywCn4zT7C6{_&T#Wx7^|W%h9Q$$}JA6zKIf4N{GX9EF^3ov-qRI1` z0-uG{Y8bHn$a)xvK$u+gm4&f1?iY-zY)n}k>Iw)6D$&q1)?p%)LXw2`QjDVX{|bx0 zwt1pX&oPT{YrBDlFywg_jIc$Id`46fDiuqSJS0TVN81IOn3T^94n2G&IN?2y&G|?& zo8&DB4JKhX=;&OB!2Ey1Im$Zm95QKK{YRNLRv>VRCsLE>KSdvTl5xQWAI^KvcfX;W z&J?i$=~P-(!E0GvIixl$N7ejG;*lm1_EcDUN(1VcwDV$3(b+7APcE7`CjOtp)4n(2 zr8!i`>Cx+Ko`TcE_0*Bhv5Ce=Y?Z@Ao*qFMOb@f;m^!9(GBgvwK!?cv=EXe^2ZZME zAD&ybQ=gy{Ty+^xoJkkB4Ga7#An8S++xfpPjb9G$i0$fEqe(m(?0ot*CcfNg-;Cxh z^U~|vhxXQ;hwkPr`KLSM2PD4sQ28Y8YlB@5KYSYRibgve^*E=g%sJZnG){BPowPGX zL@VHd=KOva+=IVkIXRZ@pycmxbK1&OQm5??Pz}Igwoq|S%Itex+IK0mnDAD|S9@LV zhA!+z*_ftWzgAhf4Tz0+VnD(8cVsdeIKe~`Lu9UfaAz58jv3`gT7HM;xK?pi3QOD^ z)$-hHgxEPY7!x^U^#(7+kYL`p(cHnKv}K56gD^qQ30DGxW`wZ$lfWVjla3=5`Ei6r zSq?Z%KM^w190D!#gZR8&O%}a6ayE1n#ta4d8>l_mvqOhXs_y9MK!43J`7)FyqBmrTu!wtY$!MhM^+l%PGF(SlgW-cq8EPVgOh<|x+r}2 z@3!p6L#yCgB;6bc2{J0k?shk4b5Tv+C}KiD;Es5gM!_2gFC)`)2V86IE7G4iLB)T8Xew^K4 zhc}~KzBoGXrsX#eWSx%91WLeX$)VwLibfOiaER57lKXMi4h@zp$}=z9sxE=liW=l( zun6*Yku(l>SPrq+EP$XiBRuuS*{u3(FqtmFz*;+}7qEUeqL6atE=C#b7 zwn7IDaK{-vGsxA4emlXHjkbl^bc@;UY>~<{ZjdYkgRusQ&sJ}vt!%C!IzCzsg35Ic zjF3||AUG*97Ib)q;MtbQ4!$k#{ARv=yp8l-QzXnVPb7qW5oXO!Cq+bVI^u?O2 zcJEPGE{^4GuZLtE1;#_Ohn8UMgz!!}sNQJg<+EN&+S=20J1X|fl|bFUc@icha-bET z_8x)eK$3?f=!~9-q>*;UOXmkOTE>9IMGi+Ir1Uu23kxzL72#ARCx#(s)S(Hz`~QE` zU@u38--Fxvkv0|%b7WpS=_f`Sj7jWt-VBs@HLt17b9@LxzsT%<#YJJDJ^-5;qMOU{ zJ<_8+7*|PNnbMdVJtpC#c@!eH=V=?9}xH> zL=+Mt<}SyO^c-wMQ7DcMDJZKcgA1)KU~Wn}!dMsm+}wWQ z@St9MB`4?E*Ln=+1KHFLlrLc><(rafIWi)0ix{&MIkAG`B8db`hiZKx!@@0z$W$+E-oPvNt#`PUU6ck2pp`8D?xJ%&MB{y8wtj_3WK^b zc^mmo_EE^;-bld8sDN@PmgAgN4=uSK%$f9Nf1!sA2rv(bP(UEx^~ARC1e;4Fki@we zbSaSQlLWQtjKq)pgM~Nz%ec{lPf5`ate5dg|(Cy9RnDPCE z8=PGuKeXM(0PwBNAexvvSyB^`Y47G(T1fK9|Z0?2Lgx9 zk8>T2 z2QG)7?#CEIUS9lr6Vb{^Av6%_0TV9z$cV=+p8T`(aoBcrc^sL3e!=+xeF`&Jt@_ zerY>b*^nL@{u0c)kL2Jp%!umX>P(O{c=m4WY`mBq<5Fs{K@RLw8h3Z|gGmB3oIolZ z(YYW)G8U|O59KM!1P7u{IbUyRhRLTgD)>uuMYqhfa*%t4U8e>k z-*|vEEnrdm$_>c`6PH+1NSF~sPcFJDNTw(w8Al%+MBjl2J^?NZ6fZ&1T_B4ZD`EaZMwM zQLPthQb}koG?#_L9?`}V(nFo+9|ire{mKV;VsRL_E-^p2h zAA!3xXF!^CHcWyG4h_J1vI!u+;vk)dLDLB_q3qy;hTvH)ihY;XiksoZGC_lr{uFQ< zB<9$FqY%h&kk3ROv3Owd)3_lmIr~aH4l(J-_fbsYr{2AR^T?}*V@ zyNsN%KJqk#+EoJY(eC~>rM$IKoCrbRMMMn-CC`f@3aqKRR28X*FF9>ZE_#@vHrQV5 zqL41Noi`l!-X5`xiI%~N>0si7%cv-@4`0 z1AhH2*=s}XK3Kr|O~!92zx@_)hEKS!XRKbx zWKZDx-d^u_tD);XOhe>+(uzN)1xNo=geuF+AOa?ViVH?IkOv}vc%cDgg^(3#SU_1} zWCN60u=_@F)LO)FF9E)aAmNcnC1(_pW@|SY9|LiKCBeeP83-JSl(Z0L7%xRT&@ve6 zKB2rn5A;K>A-C>-wA1+ySl#^R@BUW_$9ks|rY&@aV%Jw(ebF4p@GMlQb9GaRH#waL z15*M!7ehcGLwkVm6r#9eBUO2($b$SCAy@g(X+Nw9844w0pyhr$AbQmVHvhI4>H4iJ zMc+Wg{vQzm41?=FKn{q0j(pt^(kZ4y&XcQOyWXqOto()OZPKj!dfwkP-qdi9tJgWI zej_rVv04?{FrqV+56pBZiV6aWo9NOw>Kx0d?62d6(T*RMy;2L%uHSdO`&Pu3{qRT^ z3PemepnhtGQRsDnv1*Mvrhf2K`bdb#sR%M6KL7ZA#d&=4yRVK_^N{d0O&|BNEA^0s z7NStqA2?7T6v74ZcH>nuG>ls%QdpuufdL4>Pd~EP-Qm0Wj1>L=_T5EC`Cx}i|Dj7K zHGfr>C6$OK{uh1ehiO7%M^^0hGUSo;`MO}`P9DWW)S?>*P=UuQZMyCF!RVGh#S2kX zU);^%e%t_SqRMnyj-Rd)l}L|up2L|-O4DW^Aq;5iyYz=%iW zIsb1t#YrT~pqJQF}wMl8DJsQ-@HD7};-sakW+F3*y6p@J}0GAB8nrVs+ zXphzKf7APVGw;zhMkqzsDMk`xVo0+5BnI^zLbV-4iiVX4>HqZoyipCPAD36+lkfbQuE-DP z^j98JcN}h=Av#m=U@`!1o?-OrCMt5m^Yu`r|sZCqs)Ti6Rb!fc94{7Bikn0cf6bB>W&j2Z9 zs{?4F%%XBS6DM&5kKT&GQmsv;AK7EdFXma}*@xg$(w11XodT0G2U2-yXYGAOCm*+0 z?UMxlIu5E!`}@KH_`q>!RYe5;`qSR0g64jBafa0;B2tvC3ktv$Km_rn?;djy_Sohf)yAj=gzYwE(hJGOyKRY5GQ z6glC8(Div|Nj$1f3G0Aa*wjH)5bHoII)P0+au<+7%VhK^OVayZt&p-OW~KPD8X$641pv7w24e}ZYcdWOEL)j zOE?&$8swRPjQYzUP<*nn`R_W`n<}cQN~)BrAzZL;rHaH(7nb=}j|8XSA&&P$44+SW za$@hsnsEXAe$VH=|33xeDq9&zm1r9^V^*TptZJ(pS}Lx(C5GzdluU8k{ckqcit(;# zHFI@$ZfQ0&mAkIdP)37AqRDRVq}b78Mw3Zp0wL17REJdE649paxi@!av05#pwM;<9 z)=d$znk`)0rpAqnV5u})7NppuwcWbKV^Q69)Rv7V(ru<~7NW+DZ53lx8%0sEjWXLQ zq_k}=?$b$V(P-NmD$%u~(W7Lx(X?pMTQMlKmUmj_i)l8=YLe1u(>0jXo27QNYRPO- zVzP~fja$348yd-^(rDU^4a)0WI9%>?b*#E=t5Lyk2?cJ-V00|w|w@uRJxy`xF*})-bvVK+s&@pJp z6=;<$vf3je0Z=j$5|AO1MwE<3(#TlbYTHp{P1(=Y-oXS`MiVxTw4lg>0#Qmr(#cNa z3oweNqr0qKEp>4ntFmp|s_iW;GbEBjO?B2bx|*7qy6%P@*tu6K>o+=Gl__CiL6U)3 zj4Uk$g(`^I&Th@pWEI=GoZYLTW?Tvgl(lUTR3!^SgA&_HOBR)kDAX+}OJ!CiEU~F9 z6;UZlTP(7oQrdzFmepx0D3Ejq}VvOE*|*w)AG(*+#1w-}Er(lJ#h8IrLw zrR0l}$p0lavAQWsIDY)(r$;g}7FFXD)kiB5Z7e*6aIo6Q*&o^UF#u^mmcQmL+c(y# z&MYljJE@dfnLySD_4-Obl#c$ob%`Lup;}wN{*)MfLJtHeib4bzgj_(2A}3J-RB1yM zWLqco(Uw29n^JaI+K(u_l_Snx@AgTQwkpC}T9sf@AEKCvRz)O2*b8KVYEmgpr7B5{ zv`w|Hn^*6(`?9923uHVm-ndj%t0pX&QxDUktt;rPLJ<x+zhoC6I5zxxSX{JdT z78I;3u)xK#+ZbF|MkWv8Q>BKig{ZCQsZ|QZRZJEm5mhBAMny^dQh}q&UlJ690ikK~ zvc@Qj79!I8z25op<#ycMDXEiXBw&QT-|6S=P=!WNaCD0PS(Fl)(2*zK^$mlRA?Zi% z_8&?3kS|3bK)iB;xALwB2#5O8G9~4<7$>cgD4!AceKjKm4XT~0Y?dj0XQ4;|wHN$?*W#nVKb`#!1%ET2> z5J6EyICKEOA+jQIf(B3zwk{&1f}X3Vl6J9wp+icEFto6x#+jhA`t`5rDIQoO3+oO%jZ!qvc^@&b9#JLARiA02 zC=_R86eOB*N24tk6FSyPEJg*bQDB3!pD%A$UDsbu--onm9&z@F-w zf0pF`h4-aK>W(TK`Jekr^l`kO@v#~z8d&L8lYdo=Lj+>^=}@h-HB@7ST7(d;{lTAc z*_b@lwRC#b;|a57BnsK?$FZBaKPe6AyCGw6M0X_m;E@9FPVWR-w@eqzwJkpZ{c%NP*TK$WR*2M?R4!%tn(3TE>}K)TcLd9B_>MxjWl*U7Z;mc^4veQ@SBiHweBx#W#vo z*g-v+Y5RB`!RFJ6fS~>;9^i?=Q|=3AdxdC@-%d~Ihk7zx6;>%4n?j~mI-Bp7_`ciK zbs>^FWsoyL+C)4ci?Z4_@ymA8+SVL2^UDRM-Y&U=!P`)0==Zb1rLfIkX z^vkXacGfgiWVLFltt_IHW^a)HRHs6xqK)tVSKoJ%%KRtPJg@lr>XOIUZbfyM1UgkD z+vsUSWl6-|VC+3-{l@Hjbj*@T2@2GBN6wg?j{H?sxA=6p{(B#^=uGohSh0TNI$LeF z+vLIX$LjLY@$*Z=(dfZQDx#r?x(x`(hU*ucrVMN4Q;7LbKiJ{OxTdPLUMsd|y%WY$}h)uLT*3 zjwtKFm^&4fK@{+(cs^otma?wC8`+s4O-0EWRYf~UA6Vrylp{NvitgJ7b>~Jn6p&T* z%Gp(Ij}DmXs;Z@ajJN08kGwuQ{G1y`5QicZcJD1id^jG&rF~l03%k{Tb&Khx;q$$o zy}1R#yQp4d9h(F3`-IUv-L!bb^S~n>-MseJD1mg85aWgRz~|{-;|-XTSXlZpe}#7L zX6~4dr9Eo(zt-Y*?Y#9%#xt>)$?#DVr!ELye8`1DrGN?upQ`E-<^E$deLqiKzDpUGfxJe!#Z@BM!vHcFO)BmsN88tlOsnV$Li?I2-t?WM+ z-rL|o`1@&l2&o95OCfrhAn_`0X-zmberKk8r@LbpQf?IayHvu8_P;xu&nvy?vZ)$D~My>+KNWd zDCV(7+*3!!8j8lIj%BSl@Up~(0g8$ul&U2~gZQhf__z<{ZSkA_T2i`Ix|7jaEs`~D z78U!fnQXs>cna#TgLYLvT|E!PzLx%I96nvPC&=2O;8t>tt7d z%jOK0Lt>$Q?2J49_uj0q#|N8l5}%REJNnA;Q{*aBazLI15&XjBSp6Xf)@$!CRX*!< zs-B~U(hq?&2@()t4zW#rIvn0AdKCkVT6H zxpp;TyR+Ao_^-d*`Cp3nzZR?L`2YX_00004fB*p`l0um?BlQtE6RiJ7{<-0S&EQ(P zhgBJPH<+}F9%6~eePI(3MLekvU2tVIMj;5rl!{7hds;niZpnpxPvU6Niu_HVeYZ+L zpva^0kx#l7!bg7p#W&&fXG9?gf8F^%BmVG1(5WF&39yKFAEW^3Lznc~h)G6xb?)Z{ z+Ekm-K!t|Sjxau8fl3bLiAMdq;%tGXltKX*LLT3Lxiyc8lKRBd zIe3^$Mgx)AUTE)7iv5RwakbF=UVfUU;ijtMGAy<`o=h>lqT@BV00(RvrY=Rf~0Sekoq2l1&$US5Fz399Ga$?>O2P-`ACP2PNUXZH zw%e`9AaaG(SA4x`7L6w==B`Vuty8>0q23-$g@pOu>K<5#~OzO5fW zdRA*v|FLUP*H^=j_M@cFja+KIPN-VzrI2C9h^WhYgp-RVg|ElO?fkj_ zpTwHgKijREU*@JC1HL9^4l2KkQ;fSlUEIHFpqzxZhh~fX4|zb$d)Mp2GFxx_BL`hg z(=3pT6j$2+iRdlDk~RMr{azo7_Ejf$dNzHXevPPjNX+|A4z6nJT^ye$3i@g3TF*sp z6jzr&FTeVhT|H@6I4Yk(p&aGQhRW;b^Pg-vCYtoB@3u;8I(%bYHymi|QXE0Ga#~vs z+UtM8x;8;Cfe%J8l8kTD7;4a$-d|j+U22Wm$d)YteIE=sX{Wk_E*yu0XeXTdZ$qX2 zr|4Ht9)@gN+0rrG&C%oWe*sGW@AdFDBtHofpHJlvtw?X~`jeDTx6qX`XTopW_Qe;# zYL3=K=s{5P{m5L0tp`E~em?D~=BEV}_HFs_B!0m`mMy=5?%sNNzM6e&f|y|M?2}Ds zn@;hijTgcqtl4lFMxiNnXdx@-u$eMvK_1DG)#p^H&+cstL101WI-&AmYLSb3cl&!j z-hqKv;4s1C?9%5bfE(|tO=c&=2_*}fsD zQT`L;7PpxQe&S>@rn#xW@uP0YH@r1JE`;Hr}v7;5F@zL6IdqXMf)5z1d;!9@IB-6f?kU3zn#d?1@)3ZWG) z_hOr=T;xr1RAoYI%LcQOPI7X3Pg`C}+2)6Pef{3U)%VIo)a+C3y*|&fP4*UTv*A}- z{v9&Y%hsEZhI-LedM0!wElRi@9NVjjOfrjzbj9ND1mw%@JofJ1sLKQOmMiR2 z;punrlTB!wPSK^+MbL<=HeP{}R8!h_5xH?vUEIEA{>|;d+lMO2eNzUZ=Kd6R!-ABl z>1G0x>}npj=k)Y~>%TG?nBkC&CX=(X_oH;5!NEN*Y-LwYZg0uUX4S|iWe3E6!WiWv zTBjwk{Gj-r-%aD;VIdR5_3NM9S4sqxChUB)=pk_{_wJ9{TlOAZi_UKIMEbhnCHeb} z>Yutv-V+1u4G402`#!jD^X2qTrrY;1X-?#RdfKY$?nn7f=p-gsrGm<+)l*d)d->_T zd-+RC4pQ?2%iGD3krQ!^z-NX>LMHG*lurXwB?nN+(w{)lDBx6x4}`xtV9VflQ7#g7 z-Zv#_f0k#S@+8hr%$KTLzdKC-Bj_-GOOsvU9v02YVoOveFestMtK|{cu26$Lu`}CoeVxww_v9KS1~ERn!wbW_=X!JcB_$ ziR!oW>h_*y9hDr%P(Yd9K=lzKM1jEW*AAnX)~lpQoW67Th^0QBW{fUB9x#bhilj;q zdYJ_y?<9PK+9c6PuUZGrkPD(zeP7~cR(BLkRINK{HBiDD40_das--H>L7eMjuu?{U z89?~f;7DttT&Qc&A6@vZ=Ic5$Js4w5sp$AxyD`;#^mA{dCRtvXLWQFKZwF58)20;qD~S!U zJNf?yk%^DSm-NW3N%pk2L5}_!p|_j!?&BT3R_cQIczD3>UtDzknBU=I`gPv}&UOxp z8^o`dcGU@e(0fMh=;oPJ?CXUNx+*@-=thaZQnGCA?I*6!WwfbTs@6A_)!|oc1C?Se zOH%KsvEUS{G0@k!jI`>Zdbv4h7OjufMe#Zo&q{^kp=+@I!>1a)5w}3Q_3W-59>=N; zHlgc_(;mk!gbvCN&`>0r#_|`SrUtgfYUC!`>W?gat0PrfVRSx>=H+ePafPMJRGAfv znrXcoBt@yMD(1x3e27^uZA~x9hSlYqP#Nx$4#JeTb$SBa8}r+T7Pp)}}h> z^a;*GU#B&dnjD2e6(=R0Gk$!NFFE5V?K^#5lkOVzJuF73*QFVX@*-^Z(d8YA{ylqp z9C)2p-)68j3VNI)w>*Xg;CfX?CP@G6{;)SY#TFR4+NxMdaWxsC2UcO(t zy5Bf*U4QF_W0q|NcLeYGDD%YH zb98lU)#r9*7@8=RKW^5?I(F;XcG(YK-J+VYRHt#W=dW|K@@cPbP=^X#-Ri2!<#&A; z+q!a#!_EhFH*_vsTD6=Z>?=BQIaekn+0XTN3nrJh5fRR3@KUMVnf|IMgy+jT!|KG% zxK}l(vu2%8K8BTRPdruWrG-Vl!8>h)FuxhSm(g`G3(pnf?pw}98E%;q#Kh^1`1t<6 zUAL*fZWvra2~t%Q*7swN2;drI!8^#tZvzY+AfBta3V}7#^2z{7v>$}DYGM*(hLkd* z7ig2}f?=i`Ba5Yqwpe`yJcmdD*l?F77o2Ps_LJz>e#rX0|4!IKIeGPJrkZJ{nrWt* zX{X$CZOW*ss;a80s=kc_8U-al=HsEWh;D!;)KZb+MhDC`)58Hk$A(qqip8Y z+`MfzcCqWQ#=18T38p>NRVd1?Dmr#7K6Gy_&@aEj$|l?D2UN4u=Ld%>j7>%HkH;N$ zKs3(Y{vCtcx?LJsH{{X?Dl%e_>3de;iZB~Em@;)`2|Wp~RaX;QIV-4GM!_!cNkB2H zR#)qLFS0PW%KcO}tg`dQFdD0>jlaLLg3iemW}M3O!SYyZ`P(;Nt?@_z7a25ZfH|{#&{i)kqo;ivJsYX!Ea(@{Zn%p}=C{tTZDyidE|x~w}T;ptW> zm&X?6@4q2PFOz6p3Wl{7P%QG_G>Yr1Vvh>mu^o$9l-gL=nqCq1K`6*D_N~M(sHX!6 z^xxasPBa{~!y{LDIwF=to#E3DWpwEJ&TP(R#!ID;$>W9yUX7rNvqHu_W}>A$>q-FJ%k`}0-H zWyKA5XFKDb9F4tQYTYsfDj)YJ2u5;X73A*wQ`s%BSuUl~`8O1)y^wuLMy;^WW>$%3 zl@!Cjni_m_+oEQYbn1_`-wA73O8nJ|*QM_9IGyEq^KI|Wq~F&&yKH~S^R-EH@igdA zhX(XH3-#y8Hk71ZZAkMiyu61+J{BQ2&fIwv_9ApJV+F&JIgXorzCSKR@RPaZ5@cbIRv_87~sq9_pf}OH|B(V{C8x5Iu;W^RW;cp+l8sznH6nH^fM@7a( zSf?r8A<~_y8KsD?JDD<;|B zoH~%2b_uB_MK{$))sIKhczY?=M{0L?)s;Rp^VOr%>9C`bYp1|j^!*hSlcLt@=H`ty z?%$6^L<ZGl;hLTM&epD8$Da5nR6U@`IeeFJyiL6 z^5o&B(pk}?L6e;atIt0+6_ zjQy~UNn2N9&_TqVYC5**dmywHd`OorJ#;xrDV;v~z*%D{?V>8J(ynmbO1z>oR;{qHqEn@c3)vpoo9W%d zC%#rMZTGKxHw$@i7YgkCouyXuTe0)J-w)C8h10&iylT}6&l8eej_jID`ds18a@Wyw zolv)bzpe7VR_|6yl?asN`EFS)CrYetM zLJRaKKamZIvAwW(>^QxnVVh+J#{Q@h9WWA| zE78vjbax^xx?vMVYPlS{j;~L`lUT8*K;pGlvM#@jItguDVU&9FVi7~Psg1pg%Dg(> zc~akRJFSdDEo>m{uFQgw;*@9T_s-R;C8qGJLu!V&#_tb*(I=C8Xq>qR9uQrYknV3@ zP1KwQ&KbfRC=I?(B6a%c(XP)vI*#9bPI}3&6*tw_QgSkD;LuMIEOJ(|Ego-`s@__) zFCF)2fgYm5N~7@0Rg&p}?u|AJ33(eEg!|r}Q)RftT7NxUdv_j#R%Sj~1GFTr#~p#diCjC?=^Fp`1tB=M=zDsztTfOU(M1~b86+4$1b7mthkywYNba)i6PM_LN3+24 zaO@N<4Lp|*<9-Lb-}yK9=GWOIeC$Jdi1aH>Vj--?R#MwtzfIrCt$&*>wWMtuG+8D^ z7CCZ~EVC%lNwzkbp`zQXtE^bXtZAvVhD%A5!hjlOiZe1vLmF!$!x{#}EsU*-lFf~D zw%2ORP^pcwQJP4ykW~$@+1GQ)+}(wCm2T5jw4z&T&7y5dwM|K^g_4=9qcodL6jp5+ zs|_V2rjpY#no_ZoMzsG+tzCqXs#27gWi7H>M%6P^vXV;1lG;ktQd*LgwANCR*_A|^ z%&QVbYHW)sjij+QG}4((CZv;Mq@u|*jBQ5L%SfRz6r#&4vdN`0B!sadmL(*jMJr9E zw35?k)RmICu32WprL()6W@$8=H4;-T_AlV++^n#83{O|;Ci%S#eP6(oge zsaUO%Hq$MWRVLOXt(mDxQqXBESDkdz3r19<6ttBglFE{nNTynCBBe1)DQQVaQb{qI zYb9(}QiD>|l%*!IQKYhwM$Jt!SranLDrG3DYL;4Tttqx7%SkVVS7u8aY`r=(%9=#4 z;OlZzRyIneZB2zqs|if3nUzVjTNsLx)N00M8%e0PBU@zK8Ix3{G%+b=lCoJWn#mZg zB&3v;x4hf5Cd)Fb->#YhTBOCINE0-oO+lozQpnnpWV2NpQdCh@DY3Qw+_iExzrd!q zCYE7DsZ%gkQ&~?`4WxH+FfX*i0lFZ(NQjAAsS=4FPNtP*ni)lr{MBr9rwZDk{8j#n zI@C%0ERrACt4Q=&y@|bBY?Liz#B33=MX*&S)@It=)!G&@Bt<01$tW1WR0XlBi5MVk z7LB=djg;CfYK@ULLspD#RjvM-t^SPvz+p_kmX^C|Ka_|vC?RP!|Gu(@x)oKI{vE&S z{_p;O`+I-s^i_Ru+v}O#1sV$_tjoTI+r?G>t8W^{uNy|iGSOPSN=s|*ZM_RHsUpZ^ zX45K=ii=63TbjD2k|c&;izJ|90bn1OUAd}~R6x`xHs-wRv4co5OCcE&p(F+ns43eJ zZX$Mng(CIEsIg!Lx2BG2+_lOrOsLy!|9YSYYIU66(EASOH$f}Z6NgLso zs`ptoKm737BExz<_2)#`u;9(^t*aBC<&L&u?BBVXk1H8nZV8DH+=vnk)085e?J(;| zGdLh&sb3p#nN!EMof&qMLY&q~h<;_5QYeamB18s2SV%o&oL$?rLY5AsKm0gjNK{$& z2@f=uN9q(i$%)008@nrnrizw|u{OpQMfeamhzNqlDiDZ*gDR8~*$DeTOJXxo53$gg-A>T zvJh0k2OKejckY9G_V#vvh1OW*{hUt&%?Qt5nOExlo`FPj1$#V>n0GUDhSd{$X=(|6 zFZ1Tjq7y&oh?-F!$4HrEHduyPBCJiVx@%kUR@Iu@^(e5YjWo>CmPJ(ae&pJ=(j~Dc z5Ay3m!wAEobHV+pHS1`|m%OVKrJQ$j=U{@XC$7E*Zn9}=Prh?D+WG8zd|q*RNIB{k~&dOCRP zs!HovEgQG{IVXSnHH0(2n%$B{5dRZKv~BEkhVmw8X+Mk9*R5U?bI)&|W$Cm2lfn)b z^qUpl=<10oV=&y5SvjdvmigA{M*OUBPE*={nQ^2sDyeDW5(f&G{EkxoXz@99fW-)q zN?8qpjHs#!VuEWHG{T5SO0X)3s(+ZMYF<&ZDE~g55cTr+e~ljD`Um9v=|4kco=Lhl zRzF+(@ATxgi6K0d!5nGz~$sAhTQ#aXw?jbTJ6njVkFj$_Rq z`w8?ma5|6j%>Rmch^HA|X%yz_!Q-pK@8K5K317Q2dhA_>0%Rp0=~d#WzUJ2D4#NnQ zbH4+PBr*Br=TE|!dv^MGW{4tooD~dA(MB#o6$K=Ta43Egb5+)FXj{AcA-ojp zV%?HS8yhVR?a34RqUBP~j_9R|kwZrGGmp#Rr*6oru4%#OT^EuX$xGyI>QZLA3Z_>n zsal9fs?hhh?~K|L2?@UMvtPnR{Kzk7U)ADikk~F!i6BZRvi+fWObT?h)>q_dD&3V; zz^KqZSwRZ4(DpCSvSS7vwNeS$tfQ(gWGgc%e{Yws@pub<*YW80&fyRjmt!U(#N%`^ zQ!z|p*4OE%M3|hydF+^~FQK%!%1_a{V`X7-d&kB(Yk zU*j9saUR~5%~5!COrR&MyDr|C#`YR%pM&(?Az(=l`2HjyAp>PbPKT@gevfS>7n{zY z&4%(4vdv^m?^%jCvlr&^n91n7sKeal$bx4AqO_@bu#J4tvurzqv6-SsSQd}JQuBNUX#m4>fAXbiy^_&YKTl?rwBhGG-(v65jNMR z97r!6`@`Gz5qh|-2o=>iIj*h1}%r-pDlmS`tC^0PtJs_455Rs&r zvu1b1z>yMyfx#k20^-4m2<3qjtV~0+PLSFq7KxCUl>p_X=CdO60+Ns-NT@0>HHttq zfwa?J!BdxQ-iDFVt=EIxF zg6}C9$uBYxS%U=-U~+9IJm91Lqy1pMpiRgo?yNGPtZV`&FN;>8HHx6b#wZ0Y4Oj&M za9m1iP%tR91CS(U$9usr-&sinDv{jgN`0#X0gki-?_CTHu-K>H1a8=y#>0MunJ4-Y?D?o2QK znbBy7Mp}fXjcny=geM5F)P7`BpeQTCQ`!kXiND+cU~-%cyge{p=}iid*dfYtcZp`a zhY`fMLOv=KzfaBDr+9MdnAwCk6ZTilYvNrMB#~Rxps-<)m}4@r_^dVNId+jOIzo{l z-Tx%ZP@8$pa})sZroITBRcv1qoJE?mA}K_5=_7*>AasU}2Pr?cq~bWmBIcE+YzjmaHgaB>>b(mp1MLDP6&DdT6zEeT z)I}n8D96mN>4PC()y-Do;8RFYTncCkw2ecR8>}3Q4ElBi5@bm2E}9=Ck>y!xl7S;# zyc5Wl;^WX2n0`1!U0Q*_)KpBi4iKwj;T_+yfT->8eIaG0{A)|`3#%h5?8}psp%Aez zF_yihTFdSov@vDI8A}jgmF1;sqR_;&Ylc=%bNWzA3ElZ?3b^sOH>dr%9!2|aLDQrV){`QGH!WrEOe-VCqqr(8I*NNgjY_dy z5fmG5)d=!b#t_sfK@}H3#lE^%R(iesvomq$R$0T{XRM##+uV(v{a5sdhrLevC#6)c0K4qOj~62HF`f(27fqu@3OKagF&S;ur;D4Ez6dh z3MD2q^upADu|ooStLsq?T2*ygFw8fJp)?i{I$^<8oV6HXEU$daYc6BX;nxzZyc-yA zGQ^-1RIpHFRHu-qsOLHqza!kOLav&XQk+u0%lXY$MNuKAy$(Z^fywrhEFgQnX?aA8LxJ2nc;IQX zM&~?Kk)0iDKwXx%Ijs_Zdt`d(IauCTt4^*&vM_B|{P~Qcl|QS-U#B22j(~ z8SY6z6IwukyrkI?F|plnu{#S0ka&^kJ{`&DK!OwqOiB$#JtoxHpt`U}&b?7ZM2i); zRtnh40Nz~jz5*b(5-d<*P27a)1IMCd4?z;k7^o8Cfu;$1;;}TBk;XQa4hnY=(aUZO zVsf8HG-&g;bXt`(iXuc;xZCEczDJtsED<>hMnzRhbg7ZhMIt8=c5_Yic{o0(D59J( zmCE`ZNi^VuNuYAXe8%yBeY24Jcn1i!NDvYckC7ibU)jgkvw<02lTN(8CNoSivhS$% zX=~i>eaXLPah;(=G)?R(+b+xtqduVNDmD`&>Vl{!9OT}mpB(`-fzZq#SR0Xw!@vea z?!v&5U<)=tVyL34b(WJ{&2}lE&k^YQm{{Z+oV6>wi4!SEyohNol^qR4QBH7<^0qIC zO50rtkT<$z9cU;&A?y`FWe{6vmo`r@bV%)oU&R(`_7NP+D7C_IEN2)*NgNIdE3Q$+ zJgDm=42n3yTxp=mC`gp8sv5#zw-(@9bLcsEXtI$egt#La5WqNHmO3b@Q7~$l<@+=e z*e6nCSTZ5J(86dj8yJLQksuowHyq??RY>IHiJ&tEFDikh{qZNjfgv&~he|J1R!={f6VW8|q8SUUD82yk6%n^P7yRgzq`s6OCv1%S_8_ zc*ddVf+3uUl~}yt%f(btxVuxBx2)~&P(K-m*GlDH<-xI2;r&R3st2J&$G}SV*aJ3NlibcXv z6FD&#Ev(DF9+gfp7Dh38P-h7=)!Wq4hjod~nV7sTBfS6$5^J;p-$8hI&?$rj3x+8sCBtjD>_CWNPR|i zFHtK*j~8Zhby*g&C#T73MTGO3snh35bC)!;S6H~X)4WU4d5G1RtW{2x&9yz3Bva=v zhp3_Qvv`$Q6xyvAjYg+YCavZv%){$4rRrYuMP8<>7Z&)5$nlzqqcg2Mr4gJg-j!mX z1H70f3DjocMvJq3bxoYM(gHrC^-ab66n6zBLf~!mLZ)Ax5=W(tN%H z5n75f2vIeh6Bwtvsl{Z>UbC8v>pFdhEN_%`h z3&u4%QHZCEs#z-zjb-U#jE{`fO=9zULe8!!O~d0C7|g82O|3eN-X`MX1>y^Vlj1dZ zQ-S6)FhaFeipcRA#xsemI+uK2pD!wPcY_>%>1?<2vHgsHSbvxE0-i`gzFoH$4NdKjYAL+1d7C2C)xc|C;w|l#Kn}5gt6aDjT=$59=Oqu?tYpKG> z>ah3JYRJ_|P(^~ui6a7Jh=_kWuXH36@t=%8S5DoCQtGG8^)`{)`=3p?($o=BwEh+P zEYd&t?&yLm>UwhYZ6ZCZ%!;Uwp7;6xo#1KqwZ6vt?%RhVq<`c8C7N17KjO*bAT(F) z`UFCiV2TkCL+t>#54GO)2fP1}nr@HP{pqyF>kNfW$hf582^7D(Q9{-IQ)KjjOrj&I z2t;%dLL<&9XW0Iub{~KU3HI0E8+g^BaRB|H6g}X@=0$l5#0;RpLJ9gq&`Bu)?L(3j zi2U&rlm(~&^n#zHjFJQC1!homSek^gMOW=s6z+K+tpNIT8btfg#_nLWQ2{@9%d{ou z6cSy^h=Qp=LLY_xcZvI-=1=aYF2jd&taSeM$o@vbg4-d>vR&Blo5!SGR6p&3L%YkF}T?*m|Zdk5P<}E848+o<7Simotkii zXgvA4zqI4)#QzyZw)XCWmh(e);lNEtaNv?KjELNfAV{fDIGNtd6{I)=t^m^u%4Q9a zqAMb?+H;^N*lK4xHm=pMAkrusU@G(5BylH5>^*4S5_hKT4OEWpjni?b7-B}>CabBe zf)8*scsmEIArwD(_DkQ&M7GMq@Bl)Cu?e3EsIM| z@zc9C*VA^>D$^oDMU-y0AdrxdbTR`#E#EmPnE-S&PWT$LerV~})NR*s!V)gnj`$Ev zlLVQlJ55TMdkou<#v7O99G2-i^x)CxX{a5!WEc)1mX^H^wUTZ$nSsnXU|ZTlr(qk| zcR|`&o6n2c({Sb-P)=I*>@coo0ocHVF*_=|Is&xi9s6AK4P5pH9dJ8_i9Wd*vUy>W zGI%Gr6c3Paevai};J9&?Y1qXotxBTEo1I!oA_x|kh)?w$Yq;@FUyvI z6z5$nOBP$SbjUXcazlw#k`o7W*}cAX9UwRe-OSyFJ{#pk2j;F?9XUu)7wPF5; zx&BRcJI)Q{klPU4xx5fm?c|Z<5cPBZCxR5BARz#cBKe+0p+5vHq>@g+Q=slEM?dc| z1_V)P<`IwjipEBcFd-(P(Ut=5JWB}q>_Qy%5k}uiBHkAW0uK`8U&k#l2xa8&{6h1v zvrCb)@mDS+4Q>9@+S`z(YgQvva4-yN%EK1k@}KLV80^?!b4;m)gIQ0Ucp53T#+#ly zYZ($}Rjd*34kFOrOpqwfgLeV;=k3vSI0wf--`G$~zuX7{6q`+?gflQh9vo6BLZ~HZ zj4*pq^fG%8N4I(JHtTqM8}HwKE;=bEv1CRN6?=n2TMhOZb6Ud4hTGT8=gQ>8Dwxcp z(sdptKX`SX%{VMkK>pQJ@_8S3N4s~ebw^6zujDjf)XonUi^=QJOlGS#yQZe}~# zcAU9zjIC>(UCIbHVQHKb2biPXO8SF@Ircl`x7T&8GtnW-WwO$#B{7sCP_M%G{*2JB zx__T%_b!X|ESjUP4Iau0D=n2=$w$XSOw-A4_;D+uhey#!Z1V={sdTo1W6$<}lZR5g zTcz0U{FXgbO}2|V7Q5b*tO+xw6bo8Dm&Db5GamYQ{5GYrMCE-KA8W-HC{8Xz8sNb6 zwH8mtXGtRt+o!ElItR6El!sxE@RLE@l@Z*B?1PqH3tlc%{eH4<73a)VbGfYj@5hJS zRV8Mf75`FC4LWGfo2b`Cxph0=RqT&ZGEx@33cf}ON4%UEGwv77PmM$hoPx>k7y0<` zN&1P!<-6sd3HD6MWtN%*M4N(S{YPoD@4cEmcoen`_jfTV{eG@WC0q3enKQ_XM;(j5 zuLbn8@?H4O?qEU@D71Lw#2>|FMH?a0TwK1rkIl^|o$Oyp48q{Zbj4hgVM_RhxOnb& z&2KBbv|?u@hc1z>(y2z3lc>&L7}hL!wjMBrTP4vLb8If~luT$?zT7ZDRUW@=!lTlm zW!vN%tD8%#r-Crc)q7D?oL!vvTZWc>*!(Q@v$qmk=dlcZROBv5Zu&eGEebWaj?dmi zu{H5fJY%jdefuNR&hy7uf2yEfC!y2$Qyyq^bxqD(Na{QZVM4`MHiD~E&M1`Vk;ojR zoa{-J8p_RPWJXpdC~k1Ye7d(>%+m{kpi+@J%1kmYCqxdp7r+@5ii)@z#$uAfsfwp_ zhDL*4zYVpYLk2rG=;jIi1@3Q0;&3?G#T}X(kY89^foElb*Sz2~6=6a+kjdEnZOM}X zv{~TEvdJhA-Nopa(#jS1GJUgfXVc-NEPanoT5A|GH>ompxBQ9rd!SsLOFPLBbQLV^Fm=y4s?kmr)P$@FH?7=1TZhuM$}( z6LKLC&qF2Q$rIdhBxD@^fx|&NS>00EHl!wTiHfp)EXT3cN)RE)aAq0HPD5#N0mT$* zC|NVJg0kW?6=ArU1GvZ{ePjatN~pv^Q%bX8qp->k@A^qko4gan^DoYU(mtW6l?FgZ zMl67g6oN%#Aq+3?+qzii>OZFx=lU1%;$@~V`C3KHvpz3ax4FqmuQ+(6p~OHXn~TiG zRV3rfzGo8m2Cquq)~wNlP3iJHOVk&tt690kUQs83M)L>Sg2Zev+_@W|tC*`c0s?G% z*w7#+{(*uLdh(OE<8PM4>PY~HA5v;tSLM@vFEhzq2gAd^yW1}AU0>8=7{OPJxvMtvSZQ%{eH(UYpJl*sBV9hx0@Tx`Hz-14}+??;sp7J5R=dZSRGSz5qXh7l&kU*JaQ@H=CC=(9>Teq2bjV)T*T!Y0+*K`z!h_ zLdUDiyR)9Yk;UQ1=J9F?hxgCNIO1@85nDznwTmsIJyXM6X{Hucs)-carP_KlI_;xX z*IPt&!tHg(Q}I@K>%4f^wx%mE|1W;^@%EGDUdFe#H^+;tV;A7nDNi%4qKo;Xvt3My!vfQ+~&jy1t7B1)y zwi#PRq%~^K94Xy}73XbNl@g3stjHq#Q4*jv83YrGBv9kYE7ZtA{mcg;uPxF(KFKG4 zQNz^&ZzSeR$Gptj)*RErS$1LCr71$~$my2}&^)904a7Qv9S+=l&bmuyjG8bw;w8GX zu2>0w$jhSHuw>BYE34HFosL`b>=(36nmiIt@WN@n2-Ln`v z=d8F`@V&9#yqu{#y4~C_P%OppKbluI*5MxKDy6yjd5PiLYh^nx^^9qm5FA%tt3CNR5>caJ_LmGi3HUm^~G9UV0?> zU|#MW{Ty_U2uPTSZv8zaPUxeZ1hKyx^*nJ0ea3|N70a>8M)&>1RJ&}%4bW00F&S#zPA(^Be%@Q$a-$_bW1hN zhcJTYnS-GN1UV4ZOAX{r1=$7E@;MYy4o6YI*IA%+1>``)PUD9aHpLFrT=sbZ+I!d3Yxkg63`JLd$4S)KsYJFl0BduI#Lj}oMAuZ7kniy&Sbh1PKUQ$P@wjE><6_2DwLb4p?2xuD$x)!uK${UOLV-F%R3eN^Y zcnLVk#>GI3ZdU16HbYi>_PkZ&dW>R}+@>Z%h>W^{!3n_;=P3(ODGHD? z$vA-a!^Jg)OaGdI%|WWgeNy6>9Ow-i2}PkhjAGSPrb6Xx8?-I55fBW|84JarRyKs- z#b;uwDJdnjD+?Lyq`p{D1QPRI3c~qhIpvq7kYWM}|47hJ`pQ&6NTfuIA>{N}Z%;j( zol|fwZPccd?AUl?+qP}nwzFer$F^^(V6r~8yOU#mlm%L-2foA!Y)fBQNuR@x5nvyc5^ zqBrNANow$p=USdnx~#Z4c_I8IIlIh5H&&jGCfn1q4hLS>R#MyK5ab30+p=>Y_-&kT zJ>X`TJRL(Tg$IAW*Lb31?t&tO^VTw$58^psifA^o*dBq{TT{AGZv2*ANzhfYX-0>hnf^&HDcD*3auQ`&k5<4^G z?m778)W)$KEdW6#g+c)Q_pe!i~;98=Ipkg zSgD+@CL*IIc$kx`p~=$k;+K)3z>}zv3;HH?*HScKqN@tI`)i>GuKIN4udjAoX;A8c zhU5+Q9(3FaflyB{oQ__$-_l$-pv(GPl^)Nxbk5`Du+Yp0T(`MoPy9Yo9JT zW{+qR291HZ-5Grena&m?4gIsSy+s$);KPJFGN76j<@Xqo75}PWbT;X41X}!01qt+| z5=riwv!B28WH#&(q;W_pqHt|9)jBYMp<`>!Ve9vTRRH;O)ByN5aXS?%cn-{8x645e z2#y`?Wpbf>#_UL}r1I@xj8*y^P$W00^ zq;uW(b@1a7r%*(pb1`OOv?3;opG*zgxl5bKqTdY`&a0&MFg7>kT5ad$NY(3Cf<1dW zPB%-))kdqKx)OqdD$t=W^LbDd!mPIaS4De5S^Y^?R1r;MVMn z3=|^13g3^n7@eW|VEnd#KZb|9zgowk678T5YkEiS!?vGwK+o_2@S06>&B@BCju0*I zR;CEgcY}6gA2D_QD09iyjn9Z2;=0WvRWp%VuR6hW$SHDVc426ZR-wd-8wW#IduZmp zX)&B%542`iLI4A)k@SX7EOFnM4NjtnQ6(U<7}7+dnwQTgSWgW2C!E1`k9V}n8Mp&) zVDK-<>dTJxL1_5`hTrv?FPWl+qJ8^Z~OEn6c3(HGNQ#t8ViW7it= zKW0}LB;f>t)n)GQ)=3>ysCOF@);WcGROBgH!gNQ~tI+TiNzn0RVrkC$r03EmbOg>Duk;T@neIk)*uMBFD1^_LWJHen zHR=2gEJ;=i_qtFrJqY}GEH+rMPaqTK>Anhbw?7?`hW28mz#|P)DPUoqr0nx6f6lWf zIhdpo2TR_*qC42I*~8(CN?3+j3SkfvWvm>H6*eri%NNX0VJCRYV(R9xK6*NZ`NlU8 zXK1t&A#IH^z0P#3s*M_CNSR)2*3lgnjO(^-RX>cntdo6QIQ5n8sTKddJbSj^`r1v# zsN!wLbg|+4|G;XdA{nNGbx<|OaY~8AFf++8=pMh&;WUO3vb~68R&A}BF$-B1GRd^R2?KR|6==e{UWq&#GHtW=LCO5?CbWaFG>osZPE%MUs0 zz>m6Rj}>PhAAtQY(VA3RJ=FQ8mH?+-gVEu*wP)43F{^LHg&GIEleExlJqATwUNU~X zRaIaePSDbj9+RUiusEKQE-co9m?X-d`*IjM=se3dj?c2i5*Mw_^ot$(bqDC9p%m$Y zb^7fbTFet%F$mGW)Acj-KNt9YeiOjo9ernoU&SuJi;1K*A0h+#$%F5NzoG5S>9(rbPD$Jh(2?o40gW$4tThAk8&Gb~^+IK6>a zZ(~GL0&Z+zh53It`28hfyP#vS18{v3hQhbT0sg!x0`ICvdA!lq^~%ak`AP!v8*D=$ z?tD5`b7uWTEo}UeG`h4Er5DNlU&so1H~2h!r?nMO0U%$0O$6giK>e;sJFH$yzN^2* zWW|!!94|AZq*yxS)^@gvk7sDEB<0_>tq?`}HIg_)`XcnxqpbRnqL9jlt1VHpNP~4i1bL3p-K9sT~iTJFEPEvZ> zc$g7dmWM|+t72+2(x@L#`aa{zOTPSq{F(knI4?$c$>lQjdm?>l6k1Z53Y!)PAy^{L z8X5h`Plgry)tuq%6V*20T}Oq_(T^o4MP-K#Ld7TiGnQczE-w(03mtprFB}1rMaJ5YHe|g8?i<2f(IwVf-1}s zjM^##qs<<@{m6I4##-*XWsigj$o?|jQ?k$K&%fC+2Ol_KhZ zj~v#IOAGQVD*BQE^(OUZZ0Dn%XP^A;nPK^YoC4pJYvrq2-|Ztc*;bK|T3#pSKD7E( z)kWucqZ&EU2^^nqng}!bdHMU8bbW+?Ao+d%43fwq;X7+eh>LX$iL4~9bED-&S~^4gd&oB%rrV@ zJN*5~E(_GbuqAaFSc^1Y7uCdilT+m}FO`$3#Y&kDT@hw2Y=8D=T34U+Z@INgAEbo# zS8r}m$4!niD3VwqKu zHCMR7S*br3ZSvjuQkC^VXn!I)eTTbVn;A*2nNivc(Ra`!35{`xxDGfoS(*``9`dhi zB`&mU8sx@ZqV``swiA~r_nXi$qxv@;g0oIS51jDOX;b$8DAbu2j`Snv+fWezsY26Rv52hkqIqd$sI+DIy61eK1$Z+KI5edpJ{(m!UciLJ&GE?5=75ZUqE1`8RzBV0;cPLV!E5y>YU~wtNM@kwHH*RxB@9L) z!Dzh_9|Zkph!MmZ^0jXeRZszf?D{RckT|OGf8c_ev6j^D0O@rKk4~n=P2A2^=3PZA zk`k_cJJJl@9*x7uvK)V37dB5zAnD!IuCEW6!?{he37ZN60(xBZT&mT+M1QGI`SGsu zIFIOoOm#X8&$RUf`}cJdn^2v1VnAkC_(A_SCfcsV(s@H|5Ra*0Gce+zPPj;aUD@_2(xSkr5^ zm<*8epCl55PYvTK0r16#rkq~oF-}O^zwDWiV8>crPOG=Nwv9%TY*Y~y6_wzv3FubU z(jUI+3Hov~`TT*=o+F(`;%#%Hm<9$f(rjr2kuksT%QUmLl}hEeh?@=7&j z4iUHONy(<5?2jV^SC1$tenSOA?9`u$C*#T-SrV%rLoRnAKiUsUT=iPjsu*dKqq(4&n;}Wi%WS7vznvG{n7eBa zh|-a5dWYRR9)&|6BjLz#z8UsAPnqtsEkqMSkT*Aov`Yl0SE%RQYhsf*g#-88lc#$c z@6yTL^8Wj&())UNSsRW8#5K4Q!jhTe+&jOhz0ZgHmCc9rmjNb(1ZWTq_s`e}Yo^ChgE^wWz}985Pv4sJ@l zgW#AbM}zOv_VyKuq?ps1oj0Tu<3qhqM;>UUgmlJ()T{sbOWYMe>697+EKgXaz zi5q?>lURX>9Lc@Sa*qKxs~q1)VV*{g3+6?UrCqIzgJcwR)-w8uWI} z*21cvdYTZUre0G0`{dQLfqE3y-^Z5q+=`M1k3}`#70=^R9=)eDvMpK4P-Tsx@?&Pq z(rqh!M#g9}VtiQ@&zMODzS&7gdvQN|hG!w+SZD`!}uP+Gb=w#7+yxULH!9LIS(&5 zxX5t@pXXz=^LvOel2Ide6m3ESG87_A12^&ZGWipEDAN=8_jQe~u2dUxX8*dNVl0De zmhdrfl9nSeu$T=8Hi57`7RZL;_MoVT_Rp z5bysSCDK+4Uao4}zGdIWRsxj|MG|~^vo#`V=!Y#F*`fizDm|Jz#qZYv}@2ZckfC7TFwzg3|UXe<)un%Dyim;fMuEyMvGd`FoaYjqR~<9d{Gh%$-@&g$)` z$jH?afZO@4+F%KtX?v-E@@L!kbWEU1`i3ye4&al490>~RN>sqxAPt7FV2QY9*WFcg zca-hq)#(q+<>f5s7(p;2*8hc3AZ)3lcdm#8Mt92Mekx0pKxBbI-tckL)pH{vr#F|?(KN({GKu|0Pe~L+6z0u#B~hR2APZ^qBmz|+l+K6*hFCLDWf8vB zAVH=m9U(Fh6NQjsq%T8B&$WpYojBIyn}BnrD+g; zx9DLc^z-Hv zD}a;JGjF_Se3$!gGt?n84>Zpi^6P@-7mYZ?k~ezVS$5MWW?3?1TiwrAYqdYfBYgi4 zVdqnAmtEn6Eu^}(&j&n*9XW-jF$Du;b)IHF9^8mrHqhpiSAn`rZ*;IqABYdMZgznA#EJE$iIEhlMJZt@$hy zbRqtC(#x$kDhK*x=^ympgo|pv0zgGs3F?JA9Yd#x7Zm~2JDZX(4F;%KFgx|H9FvE zHJvt9pmTF$F|Ixw?%^CzFc`p!&l5Bu=1#Cl8*ehjC^DO7uV9VYh1udEh94%L`i6?^YnjS)48EBu*#paU+f2+BxPaX@=pxK^uCUuMdMTLrA9&e zoc(1~q5_zTcsOhxh**rq4z406Why-ETg*3b1`&8Uj{+BI9{$(B?ElG6Ei}1t9nUcf z3t|KzzW2IaC+<5vmKp)C|0N>dcMF=T6HXuINs|x|{_PYUX>p}>=W@?tiWzXl+|B(m z_0nWbqS}p&!%}x{TosNL7!l?08=K!bvia}w_aFAY=a@u3&RzfB4aVZR%1RLoO$NOL zh%b5xMp++QL;TF05rtgsJyJN)h3tpcK#7aRz|GR z-SMwDcFgg1tZCPOvu)4qkTu!0H1}WKwY*QFCik~?a+&lghJY+EFzZj!?K-2^qC=)O z%y@tV6l;lg_O>T@ z*5HDLbQL76mV5$ka-+T z>h-P7dJekW7K{pJ4i^O|icoo0^8PsFY(mJWTfTA2xMl7qvTTfa7zsXN{F&bsT{lsJ zG@0%GF~KHPLN)Qxmu(9YOa5ccVtdbBd2c!_eSy~m{}e2~FmzRMn^#ASihwovzA@;v zLG0XAtW7oAl|S+NqhEhRC!R{pb#j|`F%4l7kf7;F5-qzq9%_WPT2-gGqMNi?^I@~9 zz&(v{Crle&o1B5TT*j!9%Bfn6%$9`Y=P)>3Ar2ExFsclXsmP|NQLVqO5FL-PWeb{U z9K|E2;DU9I*~rpY8{4Mo9?uQ`6jhaj<1h!bV|fh?7aTsY>o9V@_{rQH;XO^n7*>p@ zBz+WRuh=zVpeTCGNKbj=XVooh)J7|M=eb6?n>f_b;ktF99u2*PL1E{O2g|J-vgUpM)*9rM-YnqrgSEr#Xe&`^o`P|UZ3wH;L=P#p=Gk*cG5szLRD zAUe9Z6VZa`f)83&?wa%^Y9UabICmCX7Iap#Av6pBxY8(5j~?8M(y|cRj&nqa=cC6c z_E+4Zi?U?_`^8^zgH&-398JUBo~+U(GwAR!>_6?47N2G^F%&l`O9IA)&LFpQ&GE=3eHdoE-F5{594peeC zJluPreCGQgY&FX&2eoqWA? z<|kWv2_E00e2@YagpG~>i5-CoaJ-2mspOu{143QjN-dd~G{_A%v(<83{qMoWT2rXBSVmTW)#6^h zbW(qcoDq$lfDtpfGiqjgI+&s=lVTuKfKYgRSU!k^3Ung!BCG#{D5O>jbSRcFSqKEBcLiSAt*Yvb>P3478QU2{n!5yRWi)I%5tJdBvk z%vQ^OhT3MB?M}Smes$Z<4G80pJf~2aKRUn&(wBdDVZslO8L=i5RZ10zz)a1$s5s7v zW}0TGsLQra1SUiP$oq@O*;NcdpR@d87UC@-q7nhy z+y#nKZeG-b7*%241ilR$t zV!Pt(TNT8Ln$Q>OI&;`qW!bP{yi3Eh8daUhZA)#{Vf5B)o!0dV|LL5_qC@&u)vWM% z>#R&@J+l_7^(oPy0ki=oBC=(K61vHl6vt8|`U1be9Niy%*%N*_15i)<+BRo#l8|MR z_l(E5FU5UOp()=0gF5iK8A~Hf$nwHae2@5jsl>(HEC_XZ?ZYd~iP-vh@nL8qvcC%V zVVWS<0f(%T%(S)3A3WI$|8^E?zG@!4&_bm$2W*hqj3B}PiaSe3AcMoD-F$jxay!#A zK~MQRMq{i}#Suaicu9{1<1_VxO8fK7cxewx~jLO1gK~{1S*2JrOho{ zv$A7Uoyt)St7wb#II(3bwM1Z8V`Rcz-)*3y3}^ElH#?D0a0d%G1~~US?Kk@r=jFRrJzp70cLjkA%chEv48) zGcKnhP8(*7rC!GuuSMm^L(Z%RgQLOQVxq;ULfwK2zCc~}pAs0*HSQ!Y{KgwY0%DrKP$^1Z zbg}w9XOOq7TQ8F^OLIY@us}vqnYkb>*~q#fONk`R?{Ss1uIrJI3+t)Oojuq0y_mczO8 zzB_)DGNn7ww4xY;&IJEi_xwSl%rUEy^MGSM2|3V>@e4otLS@xg><}{*ROj=^l@NR> zlrH7CrgntM?gm_>5tJ`UuoY!hbUYBLd%o9!Xuvql1p6%6?IrI*pC8Zo_3K3UmqKVB zf)I1LO^?Uldk%Lqy^xXg(7i7!>hG54F~)fGPA_kJ+E)9c4ZR;wZuRgE$XOdTNZpEdykL%Hq5Hj z@YOkCSBk*XD+0y}k1uW<`^GCX-PMMX+pSwV5Z61A?T+2H!#l5kTwmVSYu;6NX3Xlb zz5`dK=gA6lw9~WVSWR;2F??!bD__5$gZ=dI`U%S86H(ZX$*sYEASyfo@Jwx zD$Z07LegJC;PGPEWQbwavDYyP3Do}@A8)2^x;bsDgMGLkm6>x`5(=r_k_u#n3Qgf0 z^RtthlSnXW=nP`weF5^jNJtR~#Ic+I4h1%o4Df*m!0lU9_V*zj8CelKJP6c7bhM97 z7k7&*-RXHanNpC@dmBcR^-U(Hw+><;TZ<9@29H2{$-?&OR$(;ylhf1EeaeV*k&{OF ztVm(f74UU+ed@g@rJiKK-kk~F3kgF`(SyUjoV3rVU@mmroZUvCF&Z(G`3&RXIp^sC zZ)%Fg*jwvH1@fJgo?s@ZsVtw4-?JFL^BUQ+wR48V!tS7mIZIw(HfGxegkGPNoG(!A zUCXPGAS3QjDN@N03^R4tiL6}HEU2O*W>Iv2bnZn8DLjWS2QWdsggSdeKF`Q6P8Jrq zzynLKG2l+YNyy@{BTD>10*6>f{(Q0?eIOQRd!+J*xxW6#MTbJ_IIXv{C-{v%;<|MB zLTjfGdG*2ylOg_+! zn}B<&>lOA`t!+C&YsYbrkd$g!Yf!V)I>-EB`)m;~pjNNeZPU6EeIe7%<_AE=`AEAb zlW_RgC;+4E&0>kKnHR4FfF3RD76#Xuealb|ua^_U6sx9Y0r!h~>stnPj>}ivwr0_2 z8wl%`>*vL#t##wGvkhA<>s?>}k(hGQ;%wy{LbNGW8seuK(2=Foj_Kf-!0LI6_NY<=<$nYud%TvJcbGACnH>W@GUXQ=+~ zausho-`T{J%Pxe~Lq+rjFU(rCYsvTIn}_s3yJ&R(d08N5*8c^m_XAMheZDry%E625md&(@lFZ4j0{lUz1APO?+SonJ4F413^M z=^nOvD6F!;JTg z+1W2VTgERX!jQ47@5UQERJ?EY53@ySsl}=S0G@KR)H(%XWQ&5LOMAE?0%T74yM*x5 zAc{&*;t@2W#Z$)mTAxb#yQELSq19mEzc?R(F8PF;!QeR`3VM(ipS@MqKo4Hw#rGJ8 zuB0RYZ=bBt7SJ_sF0lss! z;9|=`c9~r-Cn&i>9i)@RLD^`Ig}pA zBpDWEtuP9)+Na^cFUj5bhqg+miQO`2I@l+Ow%J7@;QV0B`H`RHa?e1LQmos{acl8` z)5HvAZ&|8LNG3tLAtm(l_UKA6p8fW0Mr+K`FS6rFj@;-*%UrveMz4b|?4(-ArOv24 z;y;DzbXBVdw(6S%&cF5FmB{XiS$g9}d)TJ6r^Mp3*y;Lrk zr$(`5+@J)Yhl{zF3LEOGJ)u}mQKVHHqgEbbSZ_FfwiC)~vR7IXK{Q$_O*CG!ZD<>p z?s(ah)tO^InF@!CCPDxetS9!`S5@e09j9Fu+DCepN~OE2)P%r6k?)2V!V*-lA}0(( zL*eLM6Cp&!q}QUREXel)SA{2<$(_Xn>yT0Ai#W2{Ll+ahE_D4~qbx&_NaLFb7q z&QSv>?9UzS%a3n<`Vhr|g&2(xKh>yZ=UI~ z`TUh}bTSwklv9JQwQsgq;X-MNt%{e6pQ~_bdAyUo`P}Pf;rwV;w@7)`f(6V$)8h2{ zP>^j%`Fo-wq|~W<00BIRe#g$G)Mv5gsw*xYJP%!*+YDOY`+Ck$XPDZG*@Qrd5v4Ai z%w%W$I#J#;iWBgsQ5|@R+!`)B2bPm3F0l{V;gm9}4wV=L013-0o(PreC{ zEDAiN@|%MW+n{7F)kQ9gkJsA>*Q8_vVaHygar3= zUpWNQY|DWBh>zrzWXmkL9~0p;jS88^C%X+6>@p6XZget(tY+CnCIolom}qsnJ7 z6{`Dt#iuzJR5`ucMZ0nK0vuo5mq^kgq(flqfmJ9B-Gp zEorD_RoM!&RmdfM3^sM6sEv&ZVzDCgnpS1JO2(9^E>XUy@i3G|GV6+DN(k=~Zh&%v zC>?eq6O=^-g{RsLN(|!DUehpMyE%o|7>YXP;fpnOIKEAuxUKh3!OLJ@+Dub42=W-6 z_(jj!nXa4PROvihdzSW1=0la}5ydwZTqpO0;|6rw=6CoKUUqX4oRJBiU4>e~s_F1) zvSyS)j;GHu;@p4sX4qMm)D%?zn1a6$>K^>t8vMYZEr~8X(n`UNKq>`nM@DUmpYLt< zT;7xn;*2}P`bwd78EL@g%?bmG*5B{Cx-B z@be+`_DPEI^5!jKhL5^R6zlUysj=5r)#(zpH%uu9z?k6k7`xIT&} z^aCp?rbi9|E`S;ql+yJnT4*id9G0zEb52(@*{Vam?CjJn{tCAaZ>&io*XMItC-=99 zo5y3Z<|3sVsm{aVqfMV}`i@l3Q~P`^RuPtkasgtja4ZQ7>)mW@)*csYstP zGnS@s3ZMd`Y~2RqjBq&QaYm4;r`)pQ!YhhRE)%@u571F6hu5+r1_6a9x=?Ayeojk0 z@?Bj{#G5*XQS3FK08qjTQGx5;gl@RLcs)M@emD(5uhxiRiJC{!-ZXh=F(pb+)Y^Q0 zVpp!eWH%1K9s}N4n?wk#S88%Md`guhGT%f;OBHq`ZX<<@sZq0>g_Mjn#+-vOK3yED z-&ablS@FO-gL7^{%Pvh}rzQfi8bwp`{K_H4cf)lqbN16Dh+eOp2YXgJ&%a=f>?;J36v+&0R55Jn!1@7)9U|x1Qn`g4$R4ORH>*ehB>m?| z6-bk7z33t8v#~ELw2RgQi--z+X0lksq94Ni`af;Xx2a4Ok(1egMkOPZsF1#6xp$|r zwLmdmad|jxLI(6I4Q|MniZCL*+@9FrzbLoe2mgH`wnI^LRLe1K zidU`cb?%s;882RLonxc6Ytzl&pMZ+$Oo6dIGbrRY@wApbqN=eZDPC#4N1~t#INs{L znXv?Vb;Hd!KZR>?#4^6)YSB&UVsmrE-c7yQ`1g+6;GRgFj1Igfo^!wc%iO zRTUOO6>;#%QR2$Z`!*xI0EQX^u~)^s@w|7VpGjF?ZLHxt@FYQWE{X!OiU_RmW%VP5 zJs!pxut!tGH7lu^N zPCSL^+ZAz7v>Py+ro9bkyjMy~n7UZ!mHQ6OdkD)u!C)zhkQ0=Tn$-3^5o_bym0UGt z<#z_(MN+%C02{~Cwq=JDBfTBuIs1tHL;ptm;KzjC20ZS-omFLS-5g8}38 zb7vkj7k@%Gia(q!1w7CEpP6Y;rbM3gbhv^sTzf#raor7tzV_GFAm?=} z(pE5&bhI(2Xd4PTtoqeNG98~iEi85WqM{NJzO_wxZl-&s@fLs1jx>Z&3ooN%U zFF1tQRosOk#m{M|)lDhf%*6otW%myoxV_xqGPN`W@1?1?{J<4kIf)7hOG_Znk(-NF2c*JJu zyEJXLOz*g=CAjQR5k?icSab`(S=m_YJZeaj) z)=lVSO~qa0`i`-LO2{qlVapeVIxkvnLql7Wft%nkc=of#jrvKNg5hZm!E=$K(d1EQ zEMULIcy~I65+~!p1p(M8Qj2o7V1Kb@wSKkTriOtZ_QUhztnS)DRoGQ9SSr4>5AMtH zB;^(TIe@g!h4L{d9*2|aN_HWxHz9>OiDzn1W~OMJ6NnmA!M36b1CWm9&RYyo&kdx; zcVjNUR27gYScuWGhgFCPRc4lIMHC{rofrl>d(E`cn;te$M+1Mn58tE)B>P_#y2*-%L;O(I#G zrqTKp0aAPUT>}%ZavN76L>KW4#*ocOl10TNz_c=P zL=aSrgfs>z<}`n=A!t#P1D=O;pcM7O&;~oCx!a;bs6ayCy@T|9v5|OlZ0)6TEnHb z)WRsu%No#%9Y@g9%AV0;|1n}wm6A!s&Nwn!kj0fYHMEr>~o0RF1UTeOdY z2N@QY6hK6j-2{aogu`i5eBt6x5yxAH;S({cd0O7k*US_nb0DS?=|LlIE=)F6JV=#8 zO~O}+*3XWd0)rRUk20|3e;>^|C=GR3X#N{4ZLfp%hp)SQcaO~1fHknMej@)KxBm_y zrcpLC6xaIQ9$yb?3YS)oHp)j)lGJH_uqPz50AVc2gXnd2A%w@+0m*UZQj7$HDX!=@aoUqxxi}dt}KYcOdV9 z7)8#LcT|3DLmL7wM(7&er4s>?Bg%vH6#UObPJ5V^xAcst5wZ2%v)66z>-&p8q`COJ zT>lH9^W9JS;>)JQd8IJ+p1=6d5}6K*uLkGW&$#|ZeuPFP@7b|?oyXl=Om>IX<&Nxz z$xl^b3X4+3MAC*Zqcw~^uAUmm24QvRoi3~gq{PyCtY|M+Y4tf08;q^85^y6xp z+2ct&5fv6>3CSPOb>o8mCZZ5YmI6#opA3fbA1!u;-myOq-$})w0pF*7-X=`|enyR9 zP_fv~2Y@E|J96M3P)($ONM8IYx+n^F{rhh)GW|$}PE$ZXeyyi(@A5S>&eA*qzLlWT zqVV7huQacmPyi6V8~v7{*$@JYa*~4MkM^o7*w@>){P%7FSrr)Szdv6lK@@)yJ#M~t zu)lU@e!V(bUSzSw<&*5m%Q#WV6tT#HpCE)vrt7u{f#mX`Q*)}FoM4dy_-o-Y=${Nb z^@$lTk11mEaDkn{S-We3jnrK!%kZZC-W$#t+rJ(h3{tXvQUg|PDF*A{)YJvZrl3F^ z{D&mJrhf*lS0U5J0=7&WFUIoI3db^2P$V|A_F=PV28_blb{NN`^9t8;?8P*dAY3FK zFZfR@hsvV#FKCP*XcO}mgL9ukS`wwqPQ)(uUmn=j9VA$KT{&LnNkthH-h%$8l zt`Bu%CZaPdg4ZF>fET1TyHF5xuyDwMiw_(BC|z!*XIi3*z(3G`1Hgxzs&jjM28L5` z6?jnvO&ESQ_+M?lp4h99^h^9Is%gMvpOkDV3WhK+uOi0R9-MAL{LhnV!ke9$*RkWr=} zG_F^9X8j3<=ycd|T38=FJoLia8#k-Jva%9IwFQ+xG!k#9Ys_L0UJp!yL)^qVlbZbz zrILUvo)rwEWeAcGm2B9jaDc(v3W`aAB{q4Aod|7!H{$7xX42}->YxdfkG$h)Ga8}& zHN*znjGRdEL=wxF+C*GvUz@;5kd+#ggbeVQhoqw0Sqal9YQo_;lTl3Yj4;+$ktqh| zxVK#2u$GEk$WftuCni@;LtBxsca%9wub0FGw)#F!p&62$-nrX(qH<@2Z;~VnyXF~* zk|#n0t((|Fr*L*OMWY!n`$LvDkOSX?N1ppFQAp(cD-bOqbYwQ9A>hRo9iCQ7vRt?Z*DjA{ z_otib1^-ZZRRSsEVDAe9aK(1Eat`0TD)+wUJ>?uAQjFh+F<`8ZQku zMO~snwtBd5@3`LdT17u`C>eb}i!|oG*p^pvpZoO^Yo8@)6YDV=XH@N;4+QwMKA3kJ z*@pZVT^6!;aXf^f8ln=V^s7KH36F{wNaiA+SgYQ7CpWn!pA7J<98HL4RO@FOmM3xD zLw1h0q>s~BsFa*zk)r&^W+%gBI?>S)3H0+9Qsik2H9-VzokiujeD8`3&prOIHgpDT z+sL3iK7^Z;HQsyxX}PcGM!j(HWpGuvh&|X7I8i-t5k_CMF0tK2WON`L&KY{Zt>7COD^^LcD z?Jq0!6Jyxroj?Nun7`^p(h(nPZ+vmpK>{xV^k>ykfKByz*JiG5;k= zz+O>6Lrn(c|LZIXeYjQq;~}Kch$Lt2(Pw}wh*z;>tZ+6l_U7aF+$EbhExp-oO`dl4 zp^e4sD8=sT&M7wVwwT$u5$D$|!C%aGqIq-s)G5OF-$q-e%4#W+oK|rjq>|`4IO@O{ zm+#ER*!~NHZzqW_-DHIa4SDXwyG&$J_G5Ey1LF=W2DzZ5(HK{f43$wun#$J^7A2Nc z1yv%Ns)XNRIUG%3+gmdEiRQ`z%3pEE#64j7ti<#vIpo0?NG%RHl&s$oJ|2t^Cn$40 z>{mbvomIKS>=sGsBc9kQ89n+XXG5#$1YkFuCK4>G1jV& zwwl#cW%(@s7XUv%z`v38V?6yXLG`LV=Ti@~SWOx;*pf$HR?CA_4OEcCdF|Yd_QJ*i zk}#oTwP>Jn3`vtA4wk;+iUMIzGTQgqL=cdNdg6u6Wi1Hs8_P-@5V9GqsaYw5D{!4D z7YIT`ZK}+fOPmes{c#VG0QLPnEK@iE_E-O+%AeT^iupxT=Z|=knfCMYJTp6wKY>;6 z$$s;AqEQ~O>1r=jZVD$E`iKyaGs{4N1xbRnlWOFWUiSxADG!Y~^JBTsfJ6=%CuA7o z4vG8(Op?N5mLrBR(0th4@{JB%#%F=3)4e&$(__7dI_`|g!%oKxXxP2P@|^9nIU9Cu zUA-hZwcx0?5V^vHZdgc<=NcT}Mxlu~0T^cXnrm{EOpd*A%DXu}MT`4cC+tsVH?Flb z4MN{ZxEUfM2qOtvG9pj7-23|sFzhEWW*DOp7>Kcm!z(Q|lG6)&TiWv1n#6>du@w;| zWQT?OVe`R6`fh`5Xo%&|@mIVrR-<{27Q$W6kXky#1|fmTLK zu}(^o$n1)9NzoIcY~HnowD~I3ZCX^QW;V)eYq;w1I9k4{)}tdX*eY((D#VjSk%URX z2knVA6gHG&_2~RTCkgaxwRn+UUK0$^n9(-w(G5jW`&2uN6v#u4{jUHy8l&#iX!Im7 z-5M)SAJ=g&=eZW&gCn9}IbNRBhYiY-d8k-eD+9(!1~NgCEFlijHBJA6wS5|XdsAj~ zDL_O?4;1#NcGDg@1p~eV53}j=6NWz=XZ_OIe{rTZT1tpnrij4C3x+5L(pdxepY1!a zpY6VH=YQ7WMb@Y?u+q{%P>?{07DaQ80ytp2ZL+lr$tHu6EQVoV#t8_J<79&v21y~- zRP8x1ED@7psjF)nY9c8JSb-%#lz5z+<`fPlNy!tCL4yU73k8Cb6vi}yAXZqy3)>0= zCuGdQDv9^tEODdXKqfMD;qLQyWwW6&wz58pc+bVT+X`@-U zB~4p(F|4JnOG-AqrP@~5)h3O!(`dGerfpp|_imfluC$tF0aAiYO? zlo19hv1wq?kg#FY;m&i14s%E-MhVMF7-~a<10hUU6R9T>GIGFJ3LG@BlnW{$KiU{f zz?lUk;snV|T}lLCf(ry-ks<~XgFN6_1k%b3k}_DLlZug+*%pyDg@(%`a7c^;i4JIU zNJ^>2Kzl%k5Sp@HqGD1)r}f4kTcZ=@H#)|UIiG;`-+x>wga}0)3qCPt#Ug(duHp}h zd-YADu`1wuh?YVThrK=kreG-=lY+>9tyr=Xiz#YZBid9jsZmiU^F0c)En8b;Vxlx@ zfZ7Qi8VTj!M6V94#9b1vQwI(oK!<%uu#E~a~F%A-P*$0D~uJJwf6J+dg zN8pjNB&ilg5mJK%6ZFlP+j~z~+Fx!>4q!C^;l)B$_I^KBteo@_Kz--1V(BRK{hsYWtNshqJ~^ z?@tqWH5`WyC+mLS-ObLg6BFC$o5RC*MO9TosH#;}Am(ir0OUdSm?$1Ss+??jCb%$b zX>TtEVU(|Wves0ui>o*Iy8y9k;%iJES1u^x=D-Ek&-i3)n1v`88o(AX>VBT z+HWMD!_I@yLPz=k#+ebgq=Wr`>M0iB2hv1C){r$r@Rc!SK7d$-EFalguv$s>)vzv% zt5!(VRV)uDwNG_oRa&aljvUyZ*L>kWr{nd$$6NKD1jVw7T83{O$kA=!i5Eg9>TMCbs+xSy$jg!BG!yjKbe8Z_eUznK(M?(R` zdNOF#Sm)^4%VPDC@pn8q{!rl?{P>gFRX0k3pwF2eASo<8E2IE9(X5y!lSlfGK~ zW{A#Al4a?VwcBGKH&%;S4PHb8Hb(41jDi573%S|R6*~dY~vFlXk#STx`gu)@ng><4c$49oqK&j zlq&W~-a!ZBv$F>vgNhYKd0`UNNn|h%+qfRFz}8qZkFU@tj)v#89;-K+*dS_}t6*d> zAiHZVfrC*w`($)jk2Q%M)H&}4R|AxMstZ7#P~4h52n=Tvn%&!(>mT}lo_N<3H09ai!Ysxj^y}inPOYE$79^Z zc9g`kSTZ^qdY%`!J46#&EI8n8KzTL3-Q%UOknR%1GY#bQZvuxNgo?PWKZCgF?BbRj zB$3dGL$N832?6r-6R#0TQF@ssN-+QtJ}1!SqvET_Vy_O`S;iujpvj>KVbf!%JgI77 zleI*|rm^QqGP&E)C~FVpK-CCrvryf}sv<^=2Zb^=yX3@Wje-IGz&8YTL6>2mP9|n{ zD^6h^G)`Nhy9wC0I&%yT>F)9Ng)dv5Z$mJM;EYJBNLU(B96m)F_#9FhwmS8SW*jLL;0Ujv-ly1`4evuU z#EIuImc_%nns)52-ORDt9|M+ zTN-4|xOYm8+_5>q=sW%$zGq>d9qRCR!JuOzlD@GJJSQS7+@g?MuZvxY_^HQ#b%yqR7jBEA&~#boM~?tG}=4n z<{zrZ5c5r+WmY3f)T2X|1?@y$Y7CW8RM zab70K@a`Rm*(Ydr~6!u(MSHf#h3aKp#9! zscLF5p`Aw&I1spVdKw|h%>^L#0{)~ybj{S{z-6#YHim+aa7W&nQKCk0$kerH_KC1b zih-Aw$4t~W#}|rXoepW_9HijAUiBwGbWMgl70*mcdtMN`EUQ7Jj`qaIkBMxn;CY0| zvun7hBTW<%S34ewj6`XRgo|(-QApKDLKLZj1AST~Iv`;=7tl)_!ub=gux!!`sj9C* za8EJ&X@7do6$Z;!@i5L;mHDw z4mO#afZUkBYn`uv%7MsPb0ex@24aQ~#|0MI(-;cJ$EW}-A%gN*(c#NbvK6;&s&?7a zWwR5&cPQeMtECkN250TY4jc>`FC+7&;eXtu%| z4ZxJ}2Xb~NtLBssu!zY84>jm z1GIHcJ@2?rW8w1%cw&=h;FzCfLmM1_C&`b_a)0N^$kS&$V>Gipr_wn3`ge>+f3k!# zeNfkD$aaOGdwrwKSp+d)R$2?6>VT^_dT9K+JSa1A6Kv6L9QK z#QIZ+Z%i)kX}gMEcQu@slI&i3k2H#8kxbKYxh|=_GEM^%CDC(UrC{(0=%A>KPW6hX z`vKQ3S_Yu?gh&e*0cnA>up|*frN``2NiP0D-xDC znq%xr&u87U*{VLMDF7XmCSzf#cpNd<5&n8$r4?<{mag&8^V%+je+)PzZMkV)+0 z?9*UiV7tJ&Lwj*gV~@1RQ;GEcU`y0Ep3X&-krF`@m4!t2rf%Va6dCYx;ZBGLM9F7A z&EZ(u85~Y%U_QU8!(3cCq<5+l9F#0hOIClHv3ePG0&LQQh6M2#q!BrX$c9dyia20) zD%vLCA2D%djBI6r{YK%5@r0QfM@C?>e^VHg{0)sXV!0!uY2)bl$A~5gg2TE5nDBw0 z&KZU_4o938*knnf>B3Mjv!_wVNGe+t5ZDn-qQE2tK)5i2U{xnZAo_+T9ql8UkO8rC zt&CMNAgDlsE=*AjC1oMH!U~oql_WXh8>LMo63JwfokthXd`?9aq=z;8Xi5ekZDJ~z z76Pq11f~H8HG*W4EvmL7oLG>^hGHs^m@JY>N|10Oq?0a^q8L=wkv5ziG))#HaZuSR zA~#qEaUt$fP7f~{zeQzQxn>q7L9ea6yTyH1X?t9ViYCk3tF@!WM!3YXI;u4!YBLg? z%G7`~ZsT3?c)+Ojq|G2|kB?X;H~`@&(=e@Yf@Cjj-2HTk1{g%mSdRp&DOyup=yc|2 z1*8W-Y5}cK%>qEOT9e%&s76Oi4B0;I2P35258UE!&uI@CKij)q>~K@|$Holv*qE8v z8AL4oDf!uzTPqT}ap5vaRJPSBmF1R3CWCYj)90VH^j1m#tta1QLS{bR?3X@Wj-}qg zR44`Zl;Ko3figtaiAzfo;W|TyBQRDLCoSO;B9)68C(nLar#PACmPv_>350{1R$hJF zwacKcaMmB@Z1U7LT`Hw-hIH0O#?v=4-*I<_CW6RdfW!;+$#NfPj^TsrlUfbIFlyo{wXnvQL273*YP?H-NR;g zH0&NB0Y{&+u%XB@PFqLqI)TV`nGYLVIzUcmxV6ug2?M39+@~{Z!Y5(Ml+1)lGD?;f z$%m&WO~5+|sQ@<-rx(1umd1asGAq6`}<)sa4t?gIN_WHi>!?=*gc9tYU;{D?-aSh53?5yZ=TPRt{Ueq- zJe`vy|Eaos-Mf$p9h{US=%8BXP1CU?AP|7*jIYQo0VamdJ5YPa0QiDr2L7XO^Qou_ zmSfxtN}UnUo9dux<3q@R_ZjgRoU&av0hxW!3?({`XfS*5IEaOhUew%n4;<7mqme8# zi)izSLOzSDw6Hw9oZxgz?;?M?31E|ic@MoSe(r?4JL}Dcq4)ZDIZs9rICXa=RQc6? zI!vjj_ePqYghzZ|cftiJ#Ci)t^#Nj(dPsYgBAd@OAo<{(N-&GsN8Mr?L-|Y^wy0$! zm?|RIytkh0p9@vO@OUrIaHP9T|NcNv!WpwxMCiuvFjNwcXb zJyQYdHKK4#0gqDSDA167u~5L}mH2G}?Oe!-nvf9UO`emiiG4xt_9X%qd*Yc`C!)?U zSNa|)Fmmj*nktoj3_fqElVlnOHJqv8x!wjlXF<$h^-$4Ah)c($ibSe4NV}kI64p{- zJO^m#fxEnH)Li|ksE6bSES^Rj$j=l{Hm3f;zM8c476!%suSa3db;(6e<0R~XKK{twQTU|&yKy05k_3}=S7)pbaoVr;i4sMEY!cRs4k8d+* zux%pv9zE{XJ32m=M9Uec9I-hSx@&$UByzAtNTcI5j~~lP%TNHL6_fM{wPmrik^>+| zWW>l`5wK7v^U2wfzIWWDCy`*LCYr6J|NRMyw}qW{Q?{O~?RNfr3~XjQmEKOmlki7jf)?li<@ zA&kTPr3Opy|GzY_sgzg$bN}R`@j_4$NJWtku!-^r8mmFpq`lb>=UHdBx<|4KN%>U! z0zfY`Hbp-rQu({XPg!gd5J=e)ne2&VA-^K1g%O!9Hdoo9o`1YDzxez%UIfW)gAXGm zeTgX%C%R5g9{w&WBrGs;bk~BO69p`EHj7Eul0@W)f13^1r240yj|tT|KQ(ldts16w z;WyaYhFWKMmnex@QKq9&x_+9<@V z5a1wSD?!{hGxL>SUwyRPJ1&N+L%7+P@Pe36V+@m?%6!wZC%)2jWHTd6C4ZUs@Iw4r zPa0BEibfs?a+F0hYCIi0+nwig;*r!H3D8a+XO}HT`x7L|VvX#{D6bQKhNF8{MT#Vz z%PYhI5*IB4%>tX2Y=x=5mC?L}(AgxUUM}8DltHN=nGs4D4UG**8cI$di-!Ni%kaW+ z@f~*?4aYz?(Un3GBC;U~2~|rY5n9>3dz(x){%DX z-)YysFzw#Jg@!^>W3hIRU;)f{S(-l9)F^Of5+10BjAO>FsohzXjF@(KO_OLW2t}lU zP4Z2MYYd5}0MZV?#))rn1Cqq5Wu37w_hurrtcsQ#hh^0;ZXKJqea3K*qM|}C+q1t! zg9GfQqu<$K);LaxJoIrRc{sMGf=nkxbnrLsK-`;!OF;N}vn?P$w0Wzba!jEzfKogM zpyh&O54>qSMd+MBv@>Re4zCX6`_A;@o!x+GsCy{~BXSPZ0x7g;2fhml!jx3QXoU{e z#%ERHkOrzDIO`gW=$?m7glwEiHk9Mj-e&~g9zJOpoe;HE#8-Lfjg@NR%7menCN9&b zPJ04*^Cs!H1e-xqc{%*99M3+a*f!{W4iDq!+&FYsF%C|V0&_Znv0f$(L^v;68G>a? zq1UxJ4C;22m+7Qxs7*Kokb}5-8bWoM9Ji~0eMuL5K`Pn-4m@tqk|d!T8XnmQQ0-EX z4Ad#5dJG+;R|tB8NC%OVOgkTN7EDYbNkHQ!Nj%8&EIyh<_gJ5`TR#8EYeA}$-4*qp z->}?u2X9lx9PR0N>pmqKmxW7#-~W(OK0jP}I12Z~1sVB1TsW27^u3;I`j2OI(8vpIhaQYPI{lbuy8 z1lH-0NdQ9_&$f|lH>Z+B$h0wDq}nk`J%`VhYUD-hX!U9}1|oT9Ka1CUORR)obc9c` zI?N|me(y)z=QpaVvRJi~2cazQf_HhzNl~SPOaPcoc$f;^K?sZTxWp)j&_Sl@pdwuv zpeOQuE?k4iIz=%*o=Ez35A?UoX)Lr^B`IV`;pK_0_S$zJuSmr#d{v6C#>sGF{t@zG zX(UvZ9ARB}G2#)#gj+=HL6xPS0G=-M~#DAI2ucP=L8E&JVDri5_bZmD*}H6bv|ID~RA#N7#0 zQjo&t$-y>M)MCiU+|+4?#578vB;TwwxEYcDoL^iqIggtpSWf>_UgtSiXpui2L5~)H&q5x1V zM2aT{0;;A&sDhxoy0Y+wOhYb~=FhtHU%(b;b*f3#36(GZq4#Tnnhw;TEMnp;v zz2XI_78MF0f5r;DRPOFB<09DgDI*F;%^lEWNV>sgmZu~WACO7RN2&xAhzZn`Mv(Eb z@FJpu)K9HDWN%U=+L0=xmkvwkhQ~|seDafqh9-~?^~uN-4h4aNc7AG-eU;&37A2Kb z@l^kXPUMLRCrDIT5UAx6;=QmBt}DMI9Vz&rk2v~%reXH8Dt)xfW_^EJV4B+u8F@<8 zYwTl+*|K4eh99#3FTW>i6pTEB3e3rYJpv{9=|j=xnMgxo>2y-2M9yhVY;f0>GiZH1 zBRky0I6i$c%p?fzFWh0+bOQcJ7tn&1xJIw3IBr9tOcf$vCh<|+vS}nXhgr$#>#30} z6i~D`keh(!>R|YvlhQIY8`5qyF63A#+Jys9kRZ*uC}uXR70{(5i$yIk7y-j>)d#5I z_W={mqmCkv(+5%BBuJ1`pJ>RquF5F{Hg!E8oPp*!(ZS6aqytl}d$tWNq*j64sVLL{ z%u6Q)M-X4+9RoJ-*cqo7v~B_?A&F;82MO&P*Lr(q2KGjDWaKrGD|f8%O_A)UbCPsC zkt0az@obQUj|g91J}a?&;ik>PQ0<6;X$3cGDa^dn$r+QSj94DT@`Xujp2^9Aq_$=} z1uR0~oR*%D^95!JAs}I@gU5-%(1sM=XMo(&k4K*i2MReGSaUb-A9_^TqD}GfiLz}_ zrB7qie`V>h(DR>~2ndQId*eD<#8$i9dnopzeftIm(`-_NJiN+07@B zQpB35CsyY~_d|~qiQi`iX*7!u{XE{JS!U5#RV&gmZXXG*H3$!AI02)9V^%$hTDwHr zSqRc>JKcyHb#1~Q5pqKoG^E%xHKZLOsL`pBET4w{n+g{n-@q-U>jTa z8awoq&EbC1_DDyFh9O!0Tmwq%nTzsJ@Kq5AAuw}YM+%cVv06~W%s=FE-M&vF%M@a} z0cI%m8n}e)+U|H%NKzCtVO?4{$uM@N4o?@Z+IuwaJ4hryq@h(XuhOW+N#H$kCl(0w zNZ8!r``fhJ84vO6DE^&b>AaR5y_fITsNoz2<}ye5*ueB;m`3X1&N)0|*A(QFz2?DH zFr&#+6skpOf~sLgl`%=Qjzj1E$^RB-R!HISK{J>@j2y3#ic7S#y-A-EK#~FPj39er z6|<`$JQF7-4~98wnB|1ZB>*1w&*5BVuM(DFUm zCKTo3VcxqV!73C|c1swdtd&Le^$iV+yle}LJcq3%0`3ljp|CrO5~PpNh7VMHMJkD9 z5@<$%mF7poZU+D~5#C_Is%7>9_SayLqn$3{(2BAs!YRIq6JkO4BosB!A5ONAlj`qh zk|m21&Wmle1+h!n@#{P5%9#L+X7r|r5Y2L`*ZhyTqn=rvh;BnEC8cSI@s5X7?y@9Q zx@5^pf~a#=SrXV5tw{?~IZ5Bg!%>Jio&?o*Ce1^;6Z|xE--z{=Oeco%&ClNqlVcn= zb5#Svj#QIFlpQQo<^W(RQAq?CL{pSdJKaYKB9aNng~X$8qSOv1>fG<9p-&LDMm8fv zLX>l43#hiEsS8YPKTVhoNU6pf5gV2NntIHGzY0Ug6zp&A}lWigBqEWLS~0@$)o>lA&M9p!6sy7?EN?HW9!OcU8rD<&&xB*=VMP(do=DxYNly zN(aodtTH5tGIATnX}6}{e%@n6O2qGVMwKMy^6+nYDfFi_LXoiFJ9~r;7mWeIHmijq zsoFsfA|2;ZLj~anuTYUvj?&G_Iyxs)yed?=isbHyj6ClVN~#ZITKl;j9d8n zEqy1UAQ|)*wQ`{(4bK`<&i)Cimx8K?B%8_KVh(X-hti)O-1DGm8wCxgy-iQ5i( zD~Zw^F(`?{8#m5&ZppL5XWFGxcKK|W-XF%|7)%%*yGuHmvIRMhJq^JO^f)xK2LbN9 z&lTrxG~w_AtWGN!dBzO{#54COOp;_0NoMqj8NsfkiPJH7yx2s0Ml?lLnUKnF6=N)9 znIvAXx51Nr4T|TD*@IiRj;{lnJY!_eEO9Z3sN6~o1EM%RN+wBx?VAe#%ub1gbm&!8 zN~%>kwz@QUjeHcDO(Xdr2m+!+bfnk5Kfd2e^3?1^7FGCWnqOtLuhljtW=x0H5L z+kX6Equ}OA^R|&ik}X7zsUp;KZa)G zqIeU{>cHVFPcY{Xdvnlk zeFJh#N;X7&A*a`~Vr--p(kAevIVNV(F_XCF;jyuHlA3EF*G(q`b7^k!xdj`>n3C?B z>X;=`CZ{q}4kKyM+c0r6l=t!rNsW`*)0UOP30ChWq^PeX-8@Jyr{pyVEF&Vw*#P?p zBXLkLPQof((IP*>0rDVXK$s!#m{F?+)g;R2Dm1Y%PLEs4J!$rPT?9^pw8$iBW9R{f zDJa|{%V5KAwe127!opFsHeOK20{D*SVEcy!*Fqq7Z@gL49nxyvL z&u&?qWHdQJ0E7j=loH9m-3uo{fT0ri7$*Zm_g6H%Lh24zbus6}2f1N2_Op=5OiqE= z{OAKN<1`K{$fvR&6nj8Ue#-%W92;2p36ZxirMdgL)Y z9@P!x(Be9DN3+f4=En7__*igJAdh~Bgur5-nG8GawvykTGYms?>4b+2pB$4Qi5L$k znO$NA_g%0Nwr%#;-K~D7@b^`>>(Wp(j9dFAVT^{X)Nbp@Z2Ma!vo-h<&Zzp1MKU8Y z+=l!ljPy-RY7Z2`6OtBTjOEi1=aZ0$#3KAjU_?0*i3v8-RLPmDT1_pbuBFu~ii<3` zep#g$(Lb58OqNxVA}|q^QXGV2UxGCLT5Nql%q%4-N;_6|3>#0S?6oce@fNp6LdCd) z-2p>x(tr$zDa~biXvj{*Y{O+@ z**Ef#btAkPk`+;zHs{R9UGh8cH?G->cbMYWObP!9R{sdBe-`C zVBXiy85tANB&j17tTP_1MlbGEjHRjV6PvS|b96}IsIH2eN==_vc@7YCC`z$O!bqZb zz-)-Z0yPk@c|_2HbCNsgo28MCx|q}{WVBNE=l(nz$a6a>ITXaUB@>mD6@+>~+Y=y& zD$044GwQ*FGMI{0NTn&rQ|6*!S!$)W>cr@Ck7miW>`^RWL3W|ZAmDm{%+;1T2vMyQ z!=<~M#Nr^^O(EHIR3JdzJ)q)*!8%5NZX^Vn>W8`t5bh-qeGD}> z&d)Sq1c)W5mL&8{uN(CA=5tq8BV5P~j~D1D?EenVrU^@Eb>S2ay(K3#4pfa3bL%Xr@8Wu8u}_5y4?v z14-Mjt8cOmq#oT1Rs6<|$1|yNiMoL82z2QrB9sH9V5&vNpiqI+meb;$l_wL*JF1h8 z)}|qX`t}(l9R9rU`UA;4g)~x-Y13O>hKE?#;M_F0iZEiSL>9z=1u$O&57YF?CoHrG zHMkiK2WgN|y>m;7b_7fhfl6U1%q>F^17^}l8m~MjX%wzSFLt~wcH{&pb9{W<)z|9w zR-!%DANH&jUwTnKtBQzJs)x<)y9Nv)wE0?RJ|_wU&LIfJf2el(O4_<>EQehk%K!`8}PDp~fuhOj#r0K#)lZGDR%tf=)fF(Fk~qF=Z)mf5XIX zfT6dMoM#Lf2rrs3{IFnTOGxYx(wu3dDrYo`WEmwG;!74342p@O z#JJO_PknFN;@eQ+4 z9)X~ejjuxc?%n~>8N8zWp9Gjp;h#Z1$EY0}u-J)2jS>Ntr=zGJM2*&2r70Pr!#WG zBNZ(9#65W8NTKqX8*>t$XuN?S&;#x7Fc+7E?72a@&bV;s;&W9sn>FW5n=T~-zqp3H&e+QF-! zLx^sGo5x_;+8cy}pDZof=tYcCcL@~x0~`m4lQc>pvCg3lrvQk-F_@bN25NnYY3R_b zl4tjGv#eGjx(kr#QGswXTi6Iu0H#(V_m~;XzTY&fy zdFVe@5T${U;2lZaH$)zMke0dMN?vQ|=4icf-VfrlSa@@w44AIrZuqammJjaU2Zfw~hwz^W&li3rGb$Ziy*ubJm5)fksJ?UuT7+W+B zBT-&1!QM`$$5@&03$WOP5&`8&wZfWYVNK_A<=M@a4h}pukRDPqhzt*L2}E=ZPXrYZ zeNs?Ji8T%0pmEBd8~{i-<%KZO1d>Y5d%nnc)Gkxvy&9TbZg(yK_AiSsG^#)H?Pf~WH; zuy`c;Z@D6d5-fw)(+)x(F$H|_Y6xtI8W|&HDB~b=MJh%1Ix1|5>U;$ETpy3X=h`O@ z`c+j`RYVMj?IIlU!3aqtEDW=LYYpL!cGo=-c9=FSO(Jd`GYt&XauVDvCgh1@xD9Y7 z114mXv;6_P@=Y;+X|aQ2Xy^=&oQVux4q8p(Zyh@}M?Pl;xqb+n1apeP;G4LUV3m`c znCQ|oV65eBl+6Foa>szg$$d3n%P|aXUw!U~D?B(GGbJ{Qp2< z6A6Y{cvxL{G9%O)ZDP}w)7bJRQ6VJEh*04*1dlj&$94y3!9laYhQW&PMKZ$Ln};&JVDL}2 zEul57>PM;Vb$ET62W^$CA}!R-3) zy%{@!-}($>GbEy+G1Y_){-Cr+rpAFgN5CS`fydJkp?uUm#}vS9GJ_h*!wT_$(<3c( z1L37S9e?)m%hIQ+y0f5lXpZjW(`C&d7FlJwU3Qly092|~RaI3}WW+E#F=I-aLq#gN zV-#4lwxi)bb{vuI7z^UL2A7j&t(X{MdIG}G*C1MoP0^0cLH7c=l{>7QB(QUM!^^MV zfAjIF;Yt+_E9ckPKkyhheF2R$2+iIX>Zs>--?i)SyMK+8i-_VXQMBLLbY2RIHP=ohW>cqUp0B0B?$ zq(gxb=PEKu4KW?oUGW_23MN5usKZk+QV%5k=il^Lxk5iygF<GutM z%983uhjQ)$Ew&=FcmGAH*UD?e0;?HOxHWky74n*%yQ-^nW-9{^*1i4`@W@`{as$>&Ks;Wh>0|I)yYHvg@y|$yfh* z3|qylQj}C)ul(?Vg7h=Eb2{f=Kfkq)c(ACU>F#QsB7I-K8Yf+q`aU(|ML+7bMGUWi zdS@&abDruXEO{2`P~`{6^#P~@jQ@X~e$t4a|9b8JYwNVNF5S0rC9a5eKYC?6Do@9d z|IwZe)f%&*r)Y;)O8E&$9wA5qI?BXgM*kbj{M z>0xD-XiwQ2CrF(ge<}B_Uy6lLS`7`GkFdWSW^6_G2r5@qB|sERB+M@))p>;+H~yBYkK{4gjy~5x0;EDP_ntcgn~j%HBB7z#` z6NCs?7?2-BAs0iT*l@?Y4#Pv}ZLIora&v||KQYTw^VQ6WbJgj>VwNhvY49Oru zNsX^BXP;PCq@P3yj*_MhBPf*%eCI10WNWOAm_LD7L3kBf+#bUbZ7W`%(XKAqPvFs} z+2^*#t1_9_bm&_8^+FXg3{I#Db1s9n1*LpBE#ZQ$>#vQwyu1%+@g+=f9a#tz^3f zM#&VI#bvo&8&-4>f~ugVmysd!M7L|zWcguNRN-dGF?@Yj~R{)p+y(&0rE1hC^{96zdqc#Gr({*UfP zAS=$|hzk3DUbHvq`TS`Vz)!4C;)L<2nQv_@O7&Y686J#DP#S&LA+Z25{Ro@FBi==G z*D6}7O5xH2@GNnd=dKfIoD%ls_94A?C-2%h!1~~O&z+EgOM#tYV4r~=mZ=|Nq>D%0 z;la7}504$5)3>Z`e9#M@;}nn%D5v(6dfu(XAtNPP@M8||xyQfmd|z%lK982`H*X|v z!;v>(|0Az{N6CtB7&)h2Ky3qDw=r%2WSy0ohQ)at5V6*_Ufrg@0D-#R?lg%Li7%$^d>ef3%YeJpICXYubn*ag^e6`bRM4~nkH0*K4Y1)z4Xq)>EA;ZjxGt793 z>sJupL#g0Hm|)jK?A20KF?wDEB4`b!qQG$+H3x8M5VKMyDk@c2=Bis9@@&>6SaoaK z?9rz=8femyRTWiArBbQRa8Pny8ftT_OUB#1m3TXgcMtA*IG41150G{X+HZ5tSr7XM zJ&C;T>)DhJY0naJFdI|Ya=_?4TSRC1uK|0L+rb}e?VEYan$t5%$&E%d)39zjN%V=R z>`b@#So!tBT6GFryx?#kQACn-H+jxS#q;|9JNce3oRQ1ab17`Lr8_T&W+}{^{vut7Wd9wCm0e@mh+V4|B_(ZUYM!G)+GZ%CYZ56~iDkB-=se^|m|giIh2#ADbH(EZ1iTyrcW(;^(wk`x7!)SDo&a7zp}(ZrM9DssZ6<{8h*E7&agp2{ zc#2wxL@Xw_RwAxVs|8h5*k~xVGB7N9P%};)N*qT;1dtr~xvQ z=AOfs#T<57vEn5U1HPdPJ$KpcL{5^Fh@%k_lUKm{Eer~80W%BHc%=@`B?-Cfx4=w6a*-95)reXgnE)}qZG01 z@zpyU74kUNu3MOeE8?PwI6^F zG-&D#qQ&c;0-JX|b-?b?avreSJ1>|7)c1d=2*D4`f)kx-$sIscSR{dw1TwF+?T-a7K0+{M-kZNCG>6F%U~O=5aeZA#Z*Zyi%S z{Qk6&)>Lrz5F|u|&wli`v!7x%IhhRzRj5u>L!eLqg~%vJoX>A3GP|>^AqRr#i3p3B zYphZbgkVTOo#{n~)EG`czdtVNyV?lL-Q86LpA(IEjJUU?Ks^ zn|AD~s`wxL&pGs9%*?@vbxjI;SJf1EdN4G;We=Nq^ZSW@L(t{b&Fpn$d2UaEQzjn) z|0LDOX-$wBv7Y^o?;*ynTf4ietIhL}#p0^C4owym9wnI=ICK&n4`5U_UwghOoc<%nR0GX5eMr6iw#ToMI4DkH@j(QydN_{!TFSv zMNdzw5j353Z!+!6^GCTZ+XJLrX*O?ih`o{FrLffd`khWz{Z@X*vzMHEpw z6>K-6CP`(c0`TcX7&4(Oc1d-33W2AHb%$|cIaA0_A{!4$qS>QMGDLW)9^YH2a-ex- zNn_(55#3TPI-yHbXil-?me;J|u8%yT@E}0vMk|WJ%3cJD%L%wLBJX+C!Fe)Bfu!lw z+4OFk%H8EYUM(j-3r}O5ZlQ#!zhdt!^(04BJF)-a6>ydd=g(OE4hqhn!9Lmy}Rl{JcL53$np=TM#%TT}QKtj08== zQVK!iM9@uM4#?1#U&Dc=+0Hf_9!7 zk>4A9&(~I~hWX}vHbz@&l~ygaN~(FsqD$PxJx;QAO~)L*OMcV%gklN#&)Qm2)JlH| zjWwv0#%auMd*&2+k10Hf?L1?X&AUlCKF@c%*7qJ`r9q}W;%4Q9H{H1ANAf(VLQV4e z4k@|BC7Mie6uux8hT4M=ec zt~JMI;S-wZS_ZWNQ+OI4vPl@pGBZ8>-&tR=9_KI}!P=*@t{pEW>|K1VPXw&f!Cv9W zVtjomkd}Fm6EvrPXWTsHT2fM@z4AWakF(7?B=z|Bw(o@VixyP8L60-k?@7#gxvEz4 zf=-vh_z})^++;U{RzbjnAj4?^&m!f+pl*ablO(X_a_T7IfIC;2P>HDRikvHqj3grn z0iSmVgtEx2Od6w_hX4;b#qv`OOk%4UnVFLqs$q>FZHk2LrF+c||1|Qds;ZKypE1^W zaq2^Y@;MD{wv?ywn98`W~*?5)jpUKrOc07Vd>81HdqiBh}_R z3@UV3dJu@dz&u0{rA;$9o^9`u0rKGL9?%1b8XKlr9+|#xW1lExXeY}IiWW+%IeIQb zo4j}N>K-w?nuRr%=mBAAtt>=gHBI_7!g}u##T+zR8NpQ`T_ESF_^vrDuuNi{X7xZ& z)Mg!>-H|VEjH3>pDi}NoO}<`~SC~5R@`0Q~j7iy0?&BL9BPJ>V7|3vJo-F0uMnKh^Jw|$<$wu*qp?L>0dX=5xmga{i|a9@ zNFo>mvTboSOeuSP1Ok-Ip(5L6n4mah=w@8Wcq$MGo?-AQk7S3q#uh>lm)o($mQzQv2GvDUh}I@q7S#0P+z3 zL&&5L_0RExNo4{-{H!R#7hmnN?rmTr5A`wS3WZ9FNdx_k*mPYLwq&hD}2u0gUl_-LN@#qK+p` z!M|7gyF~8C4Wd0Bn#8#Gx+gQuB$7nPB}oc6fvcdL^EqD^j`4I8s_MqMiLfCd2uFVrj9RLwBr%2CVRqVm1HV&~@*626kc5&*JIF}V^_PA^&n}D8-Jzu<~5fy3h za6UJA`8gzs;YQ22z5O6^8*sMDwYJvQw$`@v|ITpI5naG?C{t?gj=($jxi5I&-fRj@ z{&76hzHE`tJ4(m9&~zt&>^B^kV<`iWbpRHe(bQm*Gng*j-H&H{w7luy$mC7I))}vk z){b4+2S&s+AyLuj!&ne+%aDbc$+vR7;n=-_ncJvyDs1B1$c)PE;p#6hB$4YT>QmEY zG;VWnER`%(li?2=6QJ^=XgQqvb&m-nhe4Qa%)ReH^u4@KPNtx8&Ciouw<+KR2oPe5 zu})58^+$6}?40-O=GSQSva!1>KdE7YHR#UG(bHyW4=4-{I48Jfz}cf%Sk9nX885}0 z5c8Cw)1^vJoAsPXa;2mYK-HLLF@eN6bQ(pbi>|~BkG_(dMs^w9on4*TU8Y9CcQ^{h zq%exvu-7F1f>O-^SG(1H#ptB=H`M9JS$x2gA9@?;OFBl-Y8;2d76QOXFqSy&hnwNz zc6#vk@o#3)hk?h-VdNz8hl1ZSx4hKTe z=(-0Kv@AF|GRm?Oa{%;t_pZ#&y(FrsPP=7!lV=Gb2_Xp)TQCsc7kOu1-op@~$9$F+ zQl-fP5TzAWNme4;zVbMB@YK`5aXD@$SmG_V+iF|hb-5fA-OuE66v(7E*;@2iIqe-! ziP`p&@0auy&$$ zd3MpI(JqR*(yGg+JC87GQ=6D|rs0k}G}|2EKGJ=}h)|+AkcQ+pmKup0iO^^mWm||8 z6ciK?B_JgH@D4t&$=bZtI8^P)-GD#b!VMi7vicM=^@cU$63y@vwuR9b;yljG=;OGC`$ z^^w>^SGLWm)wrPW3>&%cbUndI2npEaYu)D}6 zQ9DCpL5MO0A>Ro^QDUq0C$cFMVn~t*9vwm56{a9R_yAHs z)JlvFpnR0*o0yMlf#Ufxf(cFQFARhVQ?sNYJsDB5I5Nfl}3 zom`n2?On{mWf6g-^wUZ{C}*ZzpdKWwBV|4~Sw?#zOz}|SrHRCW7(odoVZ`8^Qw0f1 z)%yYyaTV(SL%nX~2AQ~K>88A?W@9D?20N|v%~%(qhk@Nwr+rqDL;(TQw2<8_dqz54 zuHE9`HL}5=pvHdK)V4?(Xkg5$O0$b5Agsl8mb0;C_V26iFnTuxj6Q%65JRiQOBUD33UnZ7T!^#_LyJVV#yLP+9RRy%jsY1kb@#X{KGfP?ol z?jSJa&JTyVV#KZL6PS_-M)O$pm!*E|{I z8whBR$bKI-3k$u2su>9Yc*10%QQwm#m1UMvr@9px2!j;CVp0~uFtn!tY#(0}RLm!` zysyLK=kw;BofTN;istWDHaSnv(Dv6ewIk~`#N)ThXm9ZH^Md13o5*w%*WOOxu{TB; zOix&K`t7#gVb*uL>zX}b??K!;(uE!C>Jm}|7=a+BNFmyGFK&`am69Zd{8`clfaB6f z^+&)F0YbLR43p^!$(E*|1TnXDB1|cQqE$yOB4${juwXa`4};9@U_vJj@Zbr+6T0}$ z#HbZEhc-vABQcq6xY|8W5ZO4M-iF?N8~b*yL5LC^r5x}T$F{R3n;KgphNM>PhdHIV z;oNSvI>(uF$~ri0J0+N&;?9S}kjOf?8&fVibjBYEijUdXsf9Pr1ZO)NO>l1_PVw_Nfqk};4W2H5l1$Eewmlc<1O zlO<}gs<_vP=OH@tZfe?XTgch*;B0T%*cjt<5XD)6#`-8>~-xr+{p4A4#@Kcr&;L|l(h9MICwad z+wbWy_nZK{)bWtK^Yu-~e95j&Yc5Y3SRmeyk$4j{eNh1a)S)0QKcUztGx|gX^ zM?&a%cpa6Jv1@eNQ65|rbq)_wM9LH!0=g^@i zn;uHUdU~q~w#!uYGu3 zkYwx|Id7OyFFGEQlec#?Ho)iFJ)^~Mq`G1gMY#^MR=PH@Op*wc*r-+0NWumfp9`f8JWb)!@72FNfRV*rbd|9aC>LPT2z-C z3kf)xN0@!gLOg0c9S&+;jJz6!Ld8=?bqHaU2|Mb~WVF z$A@}+d7Q}6qKqd=<00!!qrg1IyoZ|e@E#MZK_F7aBp%#@d7jq@I{@CG4|Wtf0)}8m zo;;+7QeZoj^&LC@JsmeZ;bys7zKL9guHtbXisUPxmK7M6Z>Z5Q*N~~2CIDapUL?a} ziD*dehSRD}&H+0^Y0$h8cy}}#DAlu6^O-zv4uQPn9z7u>lKew)z}R_~o?IZv@D1cW z^5lY|r6fXQbA+lBhRfXB#~`IC6P`dgp|}`FBYh8Wo9HL-dVBp~s#-lINh4^)P>?|> zj%v<`A1Hf-{xm&=XVFEo<_Na4(fF?pFU|=u;;YT2(l+px;`kq_Xg1u>iDnblQJ{rML^i$VrpF>|)>GpLXnhY>v6+cZ zVKW#?NtISRk(I8U%ALv2jmmpOc02hTC3=q!R*qw{km^#C-=wZ3lO^a9y7V02+h#5y z&wv{lBL+xG)VMwVj^y&2o`cMED?@(x_s5PrA@#}C-hGi+^TZ1#j|B2 zOKB17DCg!k6lH@wdm*u~pR-Z+e7U2GJpy$-!vc~p7A2tpg0aI4VS<4(4JCEdnGF;) z4}sifVi4I{#V$#xY8cFep*2kfHBErhE2*iY;T%;F^gFNy7)skk+ccmI0lRwWqv#l$ z@Xz6h_Z6CBxkiFEF-%;4trHe7Sa3l8Q;y)`BuU*pH5&A*v2>lX@T2cPG@o!bcC_POhnWp(5LI%NTrb4Aj3Y5Lu z$Chlt)k6ZDDELfwUt}pH6SIKWo;3AAXHBThB3ZWzS4s* zJHx;?oNykH zc8{VB9B~J9Shm|O=#ynCsA_E%*gdi%HE0S zY$@FxN6>T}$7!RiQumwDGFweRJcBzX(1XV2y!e}r=?&A8$ZpP-D$4QN@@VAq@9E}D zI%?Ju*cbbcPeTXToR2T}j9;CTxHtgc7)?vMfnQS%Hyb$>feSt&M4X*H(_QxAQ}mY2N0yFuN#hSa;m z6Kq=`u!1@S54Wm?!!s(if>8yyu~VH|lNLy-6+@PoG$^`cGHkd;)iSML1bKd^`JNB= z$J-(F8k{H!x)rYD6!3~~CIkBMzW`u{et1sevly;CGw|~EbD2qOI<(0BAE8}Mwmd8N zECBlspIj2lOC_i8Wfet0-|8c>xKyu$7wgai{7t}H0?9Xd`=yQg@31(N!*c|=uMs)AWQ z3BS8aBfvmoh|>ZQH%ATB4)UhmOt5XGX6g(Rq$p(hczg~BPX-q$D;N}`PXMNIXJ)ik zNYg4w3mKi-=F=@%p{;7$TAKDPJ3LB^!OkjWDsxN6YYx*0pthy?;H>eknxM~ zH*IV4S((2y)yi2dESq$?ms6MLd0tzi8gzELAc&Gxc#u`quCUY1=3QD%x8=UpT1iyJ zBWv;3=Kj*kC9SZeb#49YAySiUPP60g*%q>}?PIwrH}T%Jn6hPuNdI&0)Zm}iSfxn} z>nB$usnHzUM1S%AH~SIFpZnC1do+X!?y8AQ0FppYsFDi)=s)hjdq4K0E*3}r?BJ4+ z|N5Wpmofj3{!=X2Niq;nkdDZAaq|#vLI4*UugPn6QgYtP#3K>Vh+g@;cwq`!eVFdD zbV^!1q3eNVM;NR~T&bNVaMU3CPn*^1G5AFfpA-+VfKdYP+!-QKXUFrG(IFfYJN^NIO8`c+@?3cw_D%Z z^`fBV*{aH8C1p081q(^~gbaS)l{MB$VwxS$H~opvGd(Wvp3Ac}3u#8p+F_zKuc3Qx zZc8hm{PTGywNv7g+rx-;Hx43W|Aw%HB=|}Kc+oJ7v zD3JsoIh2bLND`Fbp~H(LP~d?Kgu`hNZ;bZS*y*sC{ui9>M`x2F76C7>3W(;RTpuEFsa0bTN$#LBEt} zaHWSw7{-Xu#-^l|L1IpRKic+5$vg=U`U|)J1^`I zfxsZH=X#^r20{NA1tb|4^}%W&PQ+A(%8ip-df86|_M7VQE-B73p(@%EmYQzI&I0){My(pXgf6qnCeLMNnuadbbw zd{05bmRoDQyb=ydff6E9AO0>>QcnhOZChAfrca`iTShOGiS6>D({%Wcx7#5Jz}kNf zC)TnF=^vhP`%kxRtg4U58T*v5qD?~?BA2oFbDz0W7luW~HP0|F%(<|SaL zZGerFUE%fipR>nG`5Jl*evTaGKIZ*>dpYZLxU6^uAXkj7V-*GjSpkz-S?vQ=ted0Wl;Mqk|j?&z`zC zlDY11(^6?HN|Y(t+Ph5PQ#cwCsU&g2#A?Nu3)}^nVNOw_;z(gV&K3dTsp%&Lh@|Tb z42Bp)=g9c-COTVddL=a}aiTNkm0Z`aZEW0;Rl^O_Xk-auD3pn32FFxmWQnUAjm}jG zVlcAC8H@@AkTqE%;IJzoU_UKUez(+l$okKR_O%TJQ z_B6bOou>!DaB)hwJ`U5nuEcj~q2s$9n~Znrbb_4;$;eQA#0J)KoX@>~bf+n$!Ygwa zvJ+`!3{J)RHlUCU#QLN8pn7=Ew!-20DbC!XaV8J_%+}T{t(vTiO15~1a#1akO0n~b z!HOx2CQ21bu`))ZV%4Kt87p7Pt!}AXEK(x^DI!D#jIvOC=@%dIab&29foHZKw!`|L zt?55J?(xLUIt)k9M?n8kIS>eXkEJv~_+F$j4?ZyC1y6;6(k4VQ2SA8ia-Wz;4k4iu zLMZy-g_n}Vei2hk8bz3qmMyYV6RswIyJ+@(ZPr^#(Kw&N{jSFihkPHjUenneYjsnm zYf$zXlB||+=RvmFAfHVl(tPNCvc<4YYb1*-B(@_~L!F5J*Xm&$sT^BK%7XURqPo|)MV5LB?haI5aB8dpFRP%eJZ0Q#d4$dL6eQp*>mcuGyjXC%n zyB^q&lgWpP-w^dJSe@$xPmHe|!*7!r`fN;ujEBKOp-Wp;_S0@1uiQ4ha?gfsIrQ2qcZu~2JwhfY= zhKM=?Aw;1g!(FT&CL1z+SR6;@T(fLXh>&DdH(??F7-$yz!s016WVHD_zWSeOWN$U~o~V1wME9h9>Vfq|v-%W|iDXo*RkYNZBB~1^ zYN4i#vcvK!8v;a4LBsy*29rUGLMBDg2*phY*)P>uE-UM6QfRni(cJN?n9M&*4GF=b zD6j{VvRYV97ZEUs!qlL$RG*^-4JYs>6Yb@+fs+YFVwlQwN`?l)qeXz92h2Vp)8>1} zPQz;b6pwI)(z;ryKr9h1BPHM=kT_~%g_eq9;7TEpA`Xm}6pC3bBq4+(l>lIhjX+Gu5mJ+EDk)-9z{rAo9_T9%S;BZ)f_t(}$&WY~53 z%ggBG?a9u6D-J|@$8p3qCWER;{1Td$Qd-}lT`Ly-4Xv)0$!%)Y{^y1!f*$i;s`6R; zeaxo-?>jRxPKG_ncPDl zpSM^R?|TiKmbk4b+S^K!SyfGujE74El66&5bKMTG77&eul*R`57E6-;LRtoaPQtLg7hn0!}&J zq-Cf76(@_QD@b@D%0$C_I^}zdZF-_{C4R@T7c)zA&9tP>oA%w^>td zi!J+iS4AdiQy~UKV8j|U2mcUn);opaNEl8yiL!{2kzyfasW)WFL|T$cC8+%I@R;3Z z>xuh5!PP#3r^WJe`er+eAk|3Hg^E6Wvo>i}U(KQ9KNM$tl6Xe+u(-1t%os``WGgPv zWFZRUVRjZ${GqH&#ei$iM^%X?#uWmH8A)LO5$y}?_CM(UPxO=hM1}mT`N@y%s-AuV z?$ony>IeNvnVNmL>16~vOp!HQ2pc;Oj4|WVRX{Mds;G*nfss}@5d!%j85B|KWcILQ z2pHkg5=o5)(+k(LN)E?bo$o>QH-3_zTuU8F{~D{8{2KBtli7bys9vY)U{Z%dDC7zA zwp#|lA=zS7knaggiWO<=avn{IXDp-8WS@BbNc{sg?`lv$D}1NY`cFOF1p2&;5QXd% z!6BQBRpRr6We3&Az%c6r_Q2GS{~#!(QRhXY?fBb_GAvbBk(qAIo5BKiGJYQ%g+R&F z6gngiTHy+dOjt7F&!CcX-ql{=$>NqK{9;DWB>$;RE4at|l;JxZz1QGvKeos5n?~Kc zIA%B=^UN8Usf;d2DYQi~6am11f)cfo2SJ1w43Z{jXloIyO)Gl3w=>*%`jxgx#F70r z*iw>Ow2m7FjRh=|k+TV! zY2q4oPlaO4PScWsM_e#%Fa!!T3>St*oF3tzJI9HGQwvFz7!zQoz|q!D@@J=pkvTFO zzv|zKIVgRUHQPS2SnYSGkz3io_Y8r8euFiZNSF}G3PAe*B5T5l{Uz9<_+S1X#m*e3 zDU4glm5WSanNz>lj}->>Fhr=KLA>9L8m1{Am=hL6giKOOs_w0H%!oNtdmTDqlv-PC zEp*63u>!qD3jaku{WbFr3=uOCf*L{}NdC^ldG;eX(8AAw`5y$0(mYl+kn%lc6+Qoe zeZ1}J?(1{v?|q&BSpLTmsTKOvOdc<6tXpA=47pE)_i3YPDp@wlQYm3OHoWe)n44uH z+?Fk$7tO;}XVT%4ZhE9>bQaHCeD<$F=_I2eB%N|bh`!Un4DAleqbOvDma}!T-|&fuKPXM2I*PhJNnPc19eg$~_@@TF^mUGD!@NT5vhdTiS2I#VjCirS!)P>E*??Uc$I!3?6*(mY~Q5dwl06%G*; zT6P;k8>1yE!jzIoR~+v>hC%qv(AyxJ*c7Opy7u8WtSgd`)Lz`MBs&HU#5t8Z2jLQF z+e=LVnuU-r&Ib!fkK;BajCPMWf$P7e?_&y=hWcY6uepqWj zf}MjXV6@g@oS`Z#NXCYbGC&p#$_&frpD#Lnp>Qch1q?+)BT%LR63p%yMV2C#DMzCo zVws4$ZA2>-6s(-F1h9h-P=KDZQ+(MKqt__o6I8k%9UV4R%#6%qGBKE^mwHKt!M2&v zepGn{hM?2!10Fe4t(R`dQMFe9aU`APkUE{`8jzYSS>9;SlQewKgU1-30%SV!{eSts z2Jh^Sq~Tpil)IM{N&z zleN7yP0C>mg2WAEsS-Gj0=x!I4zRAYTQ{;tTLYZeG|2N#ZIig-Xx${LVU{A)tS3n~ zY@K6h?HgOWoaAmkEXO--Bu|a2>iE{T)4qQ9xDi0}cG@;YGjiI6p|FXfuzn%1PBtbO zNWzWXdAD)8IIC^7!C54W5@d{z3~4BF8wlg8x*R7GIFl!FHAQOB&~ZSNjU%+QfelQs zCUL@MNhMiQ+g9I+)T_&l+>*}1x=xC#)>^wjB#@FqNW=?bemDY-r)WN1=d<_b z-P$X=u|_LWrEH~Z)T1#nqZXduA`)DQqr07Wwi6ai{v)|!=X;qA3`VAitAmRUVG7goH@mXH%bNQ zSWsC*N@!a~TpA-`L8d~mz{!#rW+@RQu>@d(B&kb8qa`wY(4uftfahw#CS63sAy$&= z!Qhf`9t{LYz-_R+)|VKI01<{r+aMUIHXzh3DKjZDF&RZyl5mVvS6$Rpq{NU!u$qKE zZz4W=PV1A00Qx0k*(2$wDX5w)rYwn?JElvsS;4gP{tK}d6fn-eHMXnX`Frc?>(gyt zm+ALO?W(q_+bpuH++j9hq5Dl3Q~Fvk(4}n2g;7;sHjmBsk-VC27%GfD(wJz`goedU znndc-T){s$mfMP0)S{wA1VkKC zj;^)qd;SrWvQ%i&D<-SwqU9+?NRsg!bbAtaE55BNrBaHYQ^khL+heAmlfJF4w<|bn zDd7Qp(cb9pFE(-5c?Jmtz)K}lYg9po5JaX+ab&=TKww-6fh*`wyM{4%4!sjolIq6B zRqg1ym{)|gXG}f2?YDa4it51#&Q_|(V}_ep;4@YwBts?wQTAPHG0lxC>a6q+(Km=h|H*L9Z=;nha z3lPFBz_vtLZ-2ZW%!LuFO_nM4>Q%DiZha?A_D6qb)reM5wQgLE`Qv0%c5fk}OSS`kel%Yhh=iyI*Y8Jx@lVM_ZSd~qprLscF zFXKnva(InURQ)z2vxA#m7R^ZN03QM=g-&4>pq?;DPwsMP3-;vBmU2>j@3+%WSsADKJ6c*(@TOkmnPK z(vf~+fo4nY1Bh8`YkJeOMjsO+6qLsfmk$XI;qWQ%t-ddo=s?pVG*V_%K*T->PjX2^ z+(C=MFCfbidLf5aj9xcElvF6*$bE#6NJ;abYXopqcX*_Y(EJ%Do)pN^r+ZWLF{m`% zj56EAfI4Q+ja5}JI_8v8ddjn41a>6K)rTEQf;r^eB3m*-W^|N+!Tu4HRvp3i3`8LZ z$50Z}q+@f9^llc(D(ungV!Jmc@g|540hnSM1p_+@B!BEJcvSP|5N_!;>cXywwL142 z`C%wwNWpGqEtzG^N`1ZH{FOS6i9zV8_=kMRLnRI7brQiJ^g{kI71%bgM$04X$}J%!zNL*L}tCHJxqamXQ8eLZ$lsZ<6*jt zPdIgml$iuaCcS(YL&)?=CO750_j52xN_@uum>njzzStDDHcF<^Q!8m}uH#tSEvb_# zi(#8ujZtmV=Br7zinO=I+UX=^CMZd4g;Yc=vKfW4VJM`M$^z6~FveDQVQOk9tz;Es zq)Q^KhgSI_T7{5-_7-^viv>do7*3j|f|7z@)r^tC$RlB>!pvZ0j3P*JG7Y7PC8UzW z_9aGZCmxKN-(p&VmLqtv${_9|)?qWaZ@Z=#vL`xak|{}KC5otvTcqFK(MoW*s`fEh z#NsC@A-zWril>L7+g7fXub}UIIrsxmZzO%yDPcJt0*Z7gg%p+QC|E$`VXPHHzMk84 zL#$jQ#tERXniK>Q26k00(u8#CEE~aMEpksnT%@#|{4L#660u&czmU*P@CY287?yPl!;?>o8sg$GJf=*jbUJMP8b_D%GH4)rB2Yw!jVdWX^wu2p zP~N13be`crzS5%GjV1i0@4t_Y0Q0c)G@V19Sa=>DGqZ*SPMy|#aNTJrg-aVH$Vd)^ z0-p^ncEHmrnYmf95Q6TM9;M`;nsb4~hd0TH!+Plm96*yeb9%;03>M)e2*WrG2$?Cu zT8A4BhqKvmdi8PZ(d!%st0;7uiR3_#A!3LI{&_J-yp9rEi!kg`5*V}@czPKxZHEqW zp_m>rb;PHKIl%Cw!KFCqyAMS<(UeFiNGxIohcPsV5(R@iDb^GxbUftmC|Fx8Nuq|ry9|Z`Y(+8&!`v`q!JX1$6e36wFc`$s zYMBj+dR&R8EpevB#$%;!>4qE_i4Q44g%viIp9p$$3Jj;g(6g+W1H^&RJyh^7qlVKC zI)P+SgAxdnl=nAHZ>!HcG*S;dSVEFu`vzgz?ZA*w&xGxwWf6l!mqmyypB9otd^l4u zojU;GgPyt=E(6M9CK&`wXk!xEPDcnHMswUKbX|HhJr4EHd?>*aHhC;7B2cm^6*v|M z;Weq^iedZ)Y50auv%NW17P%f7e5^fujwA zY8n+N0}{)QrY%(JLKX!am+>Risyc9)e|m@cAHa!QFM zOTr$Wa6ipJo8BiaFk@02QpvP4VVS+cp*5t)XHJN7O84*LOeakUOkKPtreVWri$g$% zLpoYEcR~%7A+!sj%t|ty_;OStA@!(X%g<9n_aD6G83ALds^{+kEQn!;+9w?>zU$_*_!A%v|ZkvFE@eSTZv>QV{m^f!|9N;GL;ih^>L z6Bb1>Q&JyR2E`{5q1y`tM6}?2fEnVn}9hVE=v-<${^AU7g4f!JWhzvu{mn5m+u zCLuPk$g(#nmN6`bL>snO*VD6GL}9l#Ao>VuH%Jqxe|pRhDGA@-6$iSVyeUQlG07`f zH8=1t7fy_Vbr**@0CWyIYyKeQ59T}HR2n3NL5!mXiOM3XXwP+5;w9%@-POu0YAw_= zYj$b1FslBA8&eZ54JO9WJ4sHZhl{uySV^yIcN$5wB(Al$0NX==PP}Vq7i(b{(Ch%Ro@2GQ7>x}| zP0nTz&`BQX;v5Yu#Q7t*!My0M;m%BQ9L`Qj-5^eTqhhM{OAcvM3pgW31Q=KjRmG86 zRYK+{i4&l0V9?F+G+!-k1TxSS-6R%yK*yAO*Qp^9kB@% zWCJu=BMIJ!pdk+E;I#_vm!ifNo zWi+9y+eQfXB+9E6$&O5t9Tq_oY9x}viz#B#ZKGD2Os%&|SJ$`Jd2($p=ITw=%owY6 zZEl(bl7uLddrHo>Fh&vNu&AWf7bYcEmlhcr08~J$zZfdcd5}KklGkl!qiJpFMXK#t zl9^d;mKIW_NUHJVKV^+@VstE15t0&mJ03>%0~Tq%Heudnl)*^K^_h_aT4XrRzURV` zNXrT|dV_fx&!>u@NKLhr)=iB`8#0Ma8bKryMn**#j7A!9GYdxm1{ANKE;%i9e=fJ% zIxKNfW&EE3KZUBB$DvIHnPvVJwyO7QY?Zdv>PP`t1pf_HY>+l-D3O22978g4(WTE8 zr{=O@V<%$>WkwZRomb6k_%Azu2k9(LhLa*#l{6y>EbM2MRadUe$Hh}Z!upnqnbj;T zCvLcV0+mc~eEO(C`iQ7TAmI7Kr{Qnsjg?*1Na{p4zN-V&R{*53^}w?R3xaZihG7z= zOKi5KvK9jfcB6l;K*8VZHe~l?%X5UC%MknQhA2f-xTn;mv68F`u#&9aNcH+Fw<;W= z3iVnQ0F^?%i}>o$nDw~THpfy2tmQifZJQ_=ik@YBV^lSykeD<6b|1@QqRYBWU6^%N zwq>kYVplS7rJWAMx(E<*k0QDr(;lWt2xfVJ+g=A^vRmKSbFCX$Y^s`_^yy<^x9k08 z9HGWC%BWWye5^7}_fEAIN)RMhX_8zQY!9a%vu=ELP*fwXE2|9@mY`TDewKtzxFC;v+#Lr85RSHAsUgR#s*&0$rj zDo7GE5#sPG(nlzPwkjAb$&1vB7C9D2wmsDL+3*s48^DWbsS2GG&&R*>Be;>sv4uELHFC+w%u(2UBesPzga>w+L3Vrt_d6+s3)>!w?RM#_O@ibxbJ_Z2;RqbBb5WhM- zfaZW|5Ep94!-?~@P1+gZI4n~X#gpA&n3M96l5~oWWKxK&2FMaf&_6W#{))pB1l5uh zmK7hMrC8@IcCjml$hAwN42`7nj&CJU@`4fqf_6n(k`1^^2faMlts@GnI){%>y`o97 zN6A)OWu)SK=YjBZVM=|GK2zm^?yF#<>s^X-+xMIrB~&2m!+-l?H4%m}68F94BON zKSER~X+H&A+3_ybqO5BsWwr4(>s~NrUw#-W@>o6=X&NaNMN~>uFs!R^$p^a3H6wLm z0pE*|e@H?BYT*$vr4x+@&2&Y*6vA35R$UHP5)9JRx1dSK@+%&usN*a6qW(ShJe3Y97URD$-B~T7+S1M}C(g;#^H0Ks1ix&&WP^#k}rw zz;NnN+%w3&ox@g?fy$lnvm1@(GMkFbDhZrw1Bn5^2oT zBXP4-%ZTsWSnUuVTxSrAL*X>iu}#1+$Y z;fmaOoi}c>XGZg@*~m5A6ukm|gP!qZxd(4m^j?SZwD0b6wuq}|gFWYdUR5a5u5 zPR1;9j_&C@)awW-`+4+*Q+)lsP7w0RjjO$&zFm2PqnZa?+7b$A%os zyFeBL@`{FM2xn#+W-uy=w}sm?587&HGpvNT;^!RJ%bmYid`LxFz%5(^bS99d$1TRs zboJx#^I5L*or5qQLIM^9B_LTZBi%5CkFHj#}=SsJHBfL^VWrJb1%tzkRXd3OxvjuF!E2 ztb*H+;9%@z(xo8=So0mZSa-eJ${p(A3}+aq-wCe+W_7FKm<|mb8EzX0(~fA#MnoDI zkY7$dxw~>9aYzxwdji1{Kjx3C(AJ25l5naK{}a=H}tm!+c<9S2upa z3s-~y$YfnjFLuD7$QA??cUpV;UK8JiB&EnAaV6|0hVZ2h<6)y(H04>E${7r1y0$w> zV8O>ShSUokdU!S7TX(aSF_`YXD`{kSW+;|W6V6;71Sm;7F)A=Js-gA8AWCLu4q^(f*s9~)4 zYT{h%JDcT-(@C8;>_|9)2ob)@YzagN>7$xLFvR178LQ5>xfz?7I~vI~6!byduHi#z zlQ(NPaqMm`#)fdg<9hMj-L%D;a#X~tA;_mTWKI?i)^2p~XyVILh8T4$43ff^OlB-$ zRZfMRw07;p?(Um;ZpCL;ZjP+*MwTVfd~NWs@>;FDr}!A2B6aLRt3+-wXQoK48{AUp$SI>m@)4ofAVth+NL6ExA7ICy3pLpgZ2c(~x# zGaO4+PYV*>(d+Qg+S;z}S&5=RoRD&fZvBo9TxbN?GRQ!iqc<-(YX>yZ!PVF}f)6gpJsp}%=sQfZ0o*%5Zq4-~I&3}}2uH0D-3NiV zvWO2y)(Y*D#0jB^VWY~lXhkLiXb5u|OUj@;65|{mSp*ieAGYps$b}&|f7$OWIKYSL&?(Z;$FI!mCf3VVp|OR;5S5*x^lq?mGm>=fav zto$f&LQGlYD0p)wV?jLKbuEU|c>}pNBWxqA6hR}CErAknS)*4cu;J)4f>zt zYfM<)uE62Q`vf>q+=c_Pyt&Gwv7QE&Ag*D%44CBw^OFRlj5$f+a(8!P?w#z>y12!X zjGgP#OlBK?>ENyi<7Qh#`-I)o95N33JDq~G%-aOZ!@5f+O1(p~H*8toSZjo)d&?8Z)WzZomL zSdqb9DW?qZTuXTvfrtb(jyP~^f+?T2f&;n7CK}r#p&iq8&`LTD({$;b#KJW5f_ElE zmm0&SW^m9FImolem~5?RbS^|3xb2azBRg``d0ooOy=vl~3(}``*4R%XlcUhj7mFTJ z>RwG??y)*l*I_X3S3ceK(TgnSmTpPFg2c=m#)t|nnKl?rl1+LLIoD^&cw!mO$2}cL zT?xY=nT53M&ebEKDZClsDA`5~0%5a+IIAx+N;Zyx%L*C*GE5fZx@J?jE}ZnKQqsgd z3!_q?Y_oZ5u%gN`cLq#C4)Wc_Qr7McEjEi&jY!KLA;#8jyDWw->UxN4mm@qpV&!~G zH6W&n*Hqt-TPqIhQgwDy4n`V}MyT;5h~UFC0On6524sjN@Z7#G2n=xr;H+gk35*AU z$_Ok?Opfsznu7bR&_T?b=+T@_5R@Z{Ck#D7BY{nAn1aQ#27^x1O5x%MTcGVUHrdl) zG+6`^D+eAL`vaCoVcO*2bFsl89G2VSV4`|wX^zGNo1>wS?AOcDqU$nAF!FKOJp+zx z)gr`b%UkL~G029Z=}Fc@47emm8WJ4IkrpEj&chB!k3+?U>&WclOf22rWW_?eOm?i4 zR@t)2FiRFwvnCiuk|UtHDs|U}tcMr_suSsD(B}pSghgk@iJ|sgzUqC6@*Bd|*_N)2 z;3WWV4Y(=jMXSTe&Br5cl+J8qBcL2E9ihhzbmVd_o{6;Qb7Vk~=t0Xh<+~fEG7cIp zyN>H*XPEGh3&3FJamx0Av@y(_a^f4T4qeoW@*pb+yOztH&m)`lJBucLMP0OKv5ts$ z9^m9gV^tg{n1-S_-mT9_JO`F!Xbhbp*m1W-v`B{r^$W3}fd)gOS~^R-xsL#@*nym9 zp`6-aD=stOkTEv#DIzB7{dO}H&|(?n6&>k=ku;cm98nsF;ZP5Dr;i0Q5Opsi5)xr- zEII2ZA_IcqZP~O3A)^HgVZH$1EZZ}=BrwR0g%4}t975C?i=zD2>I-P+bhtCEow0*e zw<3kwxQ#;?nimVEuI_1orhv?DKme6omMUE_&)WGSiMj73@ zUAU^8VaY>bi*|mAgkw<9Vs2h|Mm1PMWbW>BI1?;8G})c#VaqGU<~bD7P2n=1h`C-L2lbcqWO9empW^h-m+O; zJCaW3c-C)J%=nH8W|1>#50S@*GOSkobG)>PBKYdJQ&9ypal_}HPG?kfjWM&gR_l!P zmKmQXVaDQgf|I{Vm5G%(BszA?;uFb+8o(}4#P%K!!k(fZ#Nvz z+2eTUc8dV>)8T2_-O7Ku#Fa1QV%~1K;35$jziM$23l* zImwM3AxN1-S+X$=H<=-!NfcDo7I#N?3%st;(e1dyG_omy!8p(8f+UfM|C%yWYK(;I zW5Lc}J{DBG+r!>F$$L4&hTW;OCe$Y#XFDPOPf(H)l|q}^o0y*064`?hjtrFH!;(?J zh|`k}=+nYRg*7hoFp*Ah*C_MA*cu5JMjL_-N{&Zry_zOWB>RF9Sax)w|3e1v4vHw` zrhg;4NeEno8jjfc^9!~Y589tT9CwZ8;KsAN*}X<#Jlf0Zp7*WnH;Yfat-k5+d*0t{ zxGZq>YYq3pv=)UB(1ajC4mxIBu(}!yGca=3ISPJF87Qqojhi_go9W8D?hZ<^u`)2x z7!S`MHod9-X2jiJ5#2Fd;1^iR0(3Q;q=X0@ixku(}gFhP{ZLrREHP0Adk z-&+ji$l4W1X0^(WP8sR}G44Nz;FjsW0l;?*p~>cimfRI$VYoGm*0F?LC)P2Ak6P-n zz2#LXJfPb zW+h)7_UC!U#O20*P9SIua|}?JY+6}2dal%VY{X)?j+ZX(mL1;cf*77QJ4?Pb5ynml zg?Z08Ck=Np6;9_jdxPY`SHZ2Z+i9C;L%$oy+&VVVmAy6>s>#0Cn? ziewqMbBV(i-HHyx4Qy~c?2svdqfBttsDlA$RTfiDX9gGJoTW6q`YncBK+gd(HziV~ ziD5EnlZnXg8%bf@?%;AAkJ`RxRdt$ZNmP?&CYSo=1omJO7W z4gHzAp^=paK@89LFz6`}ex&-vpjXuedIX+cFB>IJO@_m~o*l-?D#Fm@nS^4&fHd+3 z(Oi!KqapZzwCZ28=C1JTU>pNb4jV%!{IVFtE$L^7Xcvt9*LQb!cgWiRXINEHR+LX* zV8LQTDUjKy#ylc-r}F!n_L6Uh%8<4TWEM(_sR+P`^+VXFUs4u-xOfY^E`sBzg~7Ap$ZSEu~vhsEbIPD~XTxw5d0>UKET@%PP+iyq0X=b~1PG zqS9(gb7H!tKOpLB=R$So3+Pd=5TLk3puu5zIs?NYEh8d#)}e*6_C&D^9s!V_Herzx zh`~vTzO>_+#aSM>Hn7SWWGXDQsTij|jv7p}XRt|(IyiXuW9>Kj3+>Cdwsd|c^6Q?q z-E7RlnUgk^+=;+iqRcdo!#tU6{#!6|VE-H0k;Kl|L%Kr4k~sxO*Sj#<$g2`ep*z6j zJjP`|f$aLt9cBu& ziwMiY!2~u4I|-&Hgyl!IM{p$j&b#2TsOQvvwk}v|;LAzK zn^~hHluwf;Oc{fdHq?0#3>#|^tYmVs?gN!Gx4>++yUMV#R&r&mFBoUZCS1;3Io??C z-dt)KutSkr*tr{gUbD>LO%Bdjl40mKpatpS^oMR4oT(sOL{SAsY3vg)jvyf3tigoD8hgV~Q3HeoVjvvU+v>JtF=A&o2OfTVQui67`GWQo<6}N7J?HCCv{gi+9E2m%=WCk;dSSou^?2@+pt(3M-O~@`5A{ zFy2iYW|5fm(b#Ft@cGNW&cfH7QKQg9BoY>T#dz>_;gkg=iWlX49dH*d#VkWN8ipKOMpldvt(6*Ua2c4o>s_I-Z75nQyVutEJq?}-s0N1P zVW6IWIk0&}@Q50UfzU%v95m+|-G<=^^NnB)ZEj>|Za`Xbk}4oDJ(HRpK=i}0LeT8V zp#wOIxf#sirIxu@4KvbOFIGos03K7&JOVR)DWV!dUgLl;A`YD%ev%OE9jT}s14$6@ z3;HzL8>9E+|4#X^IffUAK8%$^v=}cH!ejrG06RzK%tp786wN%B1W z^BBu>`!O=Ksd8a4ayU6|ZfkXN#;%d8mnCN18p8iCi?3C|ZrLuC#z~PfjHYbaF=V?t zB^JwVTU097?(SlAlho^1_dQQG%n&e9UaAYm0_MD{QYBAS*1k9|-I1DF&>!H(u1`iU zM4-ctFn>Z%e0ymIc?BB#Okg%=lpzUe86;vrS5Xa$l$xw)WRp^uW_6Ns+Yi)rgN^*3 zGyA^JPSG67B<_+OosF+rx?;(mdN7NNz7yEl_3_#twky&x2_lRl#EKb7_*GD=C0=l! zbsV1AQaVyK29{T6I7LKzBtI*%$WiToCW0hNCMiIvPv7-D;gN)5#e&MEsVbt`Ce}RZII1fW$6n%sYD*V8`Nfhv5^f&JlpTiM_ z7JMw^58Ny4f=T^hvcw6dX`qY)j&#{J+f(jv+DzubveRQB zg=*qGQ@)hrmJ@?lmyHX-Bs|loM58u;~g?0r2H8n1zSb zeR$o$=j-x$iDflK!xe6|V<6aHLk}5b#H1ldn2AtAMCD7j!_8J5s6M~W@*;@CXx|x{ zcz8b?vOFBY1FN|nQXfr8lOX;L9~9`RJe;;0sr?Hf4SGRT^ROR@0l~Tf5=H_=Bv~p9 zB%3JNO{U05=har;r_eQo-oysTK#5H!Cp+Rq?CzP;8j)1;E$bGnZ(X|IL%K4_8VdNP zo=u;|uojPD0unJyB)D_X>9l=>b4ah^Jo?CU2nPlt+);2&KwwHq5jaIj6&A!gy}x;m zkDtS5%WoZVI+eBEa#qv{Hbc;pE9@Gr1Ymb$G!IK5k2$OsATTC$6b7AImVtv9HyG?u*`Cete_aY!f^>S0_Dn0aYf4qxK5j_S|W4Ilaa=Ki=lFu%P@nj z17OMr4z@#EbQ!2~92OACAj1f7;oYP#=M;5WAl2k{M+`i*G(RB!jWO#EGp%l3ido~; zbaYFm+1RpWcQ1>;;DE*OA|xR115Sqv?;;2>-)2b*WN68$g9IYwg3BWVR99)RwXoTd zo*9AUlVQN_MVBr+*pQfPTaC#tVJ`Yu2skuLKwwB)hR-92>Y4!7M*;>zP^e)fU_qFz zQL}yy0cQ3E?xS#%T>^~Sqo&EX1|Up3tw_eE9Lqy9hel)&((*Vp8wenmbG7#Ur4%Cz zus}E=8XuD(J7vQ_n4-}wvFU{kA}oQ>IgDnwFN3?D+grU=crzh+i;}u9@vxXdWCdu+ z0ANJG;r!yskj6=20bqiR$;{VO))=Z{lrC_xf*4@jG!pQ4je;Mu9&+cUU3 zP9g-^;|5g}@Iu4HL%S8JAi9R8qZpz_A;%d~Y_W?lTw7e>%m|wMr-Xbsd~YGIWIbL) zz{(yI5=dJ?B-n@@v@<&nVX5AaY*B}L%bAOc-GlO ztIqE4n>-&1QuN{8oEV1)c;w0D4%0LdL+T(Tq8?z3I53M_D+-Y4N}3ahk=#oVIw1nr zHL^pd(_nX(;u`ov(H8~^)FMYG2;vNyxE(qw1QMUF&9*v%i$>6$yzK8V>rLszf`+Db zH5gReXvBCP0^;T(8_9d8c#>*H$0uG6v?%99Fwo3$#Rf*5z{rqj4UMW`fX>W@0KPuj9# z<1$22%v55=Rj`fZ^m{!TJSpkT`Er2k0gxaWD2cWAL^~I1=%K(EK@dq9*qDkN)$B4h za9A73uz`)n;Uy8bRk#!Z3>rJ=!}mZGF%?6-PvsUxs3U|#{2~9PD#7aGJv+TF)7ts! z5r9!28}Xb}0~Qk~m5Nml!9HY@9mx%6V&(&K5m-qWr@%}Jagl$_ud zILSq|5z5p%yRoP>9*m)rXV8RVAaz5)UkxW)m54Uv4pNihXM=vGZ=(rV7g|3S?D$ zYfCJml%|!3m14Cn#c5%^F<%P%&2(|f?&ND^5F(LKIcP97R0O+_f)oCF2t-p6l+u*S zScpCRp`$dCeU`+rD#)spQWj9}jXKoPABxDq37WV?^TGAg8G!zt_{!2=5Nw;u* zVA;hCk{~)4rg%n9+s0<%&n+<_;jcj?;gM#R3+wV7w0RBZzGNW%m^3;liNQ@By#e|# z{Fv;hJom|--5hXirtbY#j#%yzD8Q!sl4zaf$eIv9M#$;=H-i?ihu;|iw?VN?+=y;n{cD3O&S zE|&Nh(~>CJ%S8Uo0K5uVaGW@E1b9+5CrW9~aP&~!Y}~9XW@Rk94UMCQ&JS)Tgcz}z z37l>UX+;c4LLsn2upltAiwqPGL*ZH$GliBLN*FPSS%S#en-bKtrc6v0OTzW^!yKZC zC(OAI89HEX4ZzY)2xNi`L!z~tsOF^z$SaPDBx zAcKP)uvn}TBwgBIxp=YQ*azN;opPDZOPS}KuNeIXw zwqq7_6^~BdunY@Gp<(I-?LA|pj?`=5*FAx-AMape#RA4T?q| zApO)K#2pq#3lTVYNPB=!_DRFpxRX_ zP@*(K2!x^^yVp$)3VL$%nmOO8sc{K34LH&FT)~i1t)SQDW2yY=xqO1}YfANNygTEJFt2^+Dr3@<1xB zODu`?JiK%0Hke+C9^$xKSjaG7!XUu3_%WDHTcU;_)YPi` z`CIb0luT;5optTadt#l@!VoGU*al04pi;v%pr@}4a&Z`Be_o{2om`2BqQ~F)v9V}) zB<*ZfN$9AVVOfM?#gs|3H)ljNlBk5HRESXN7r)Kj^q95lL-~ec_12S)ln_@U-G})nm2^9>3{Hfa$WK(o1E zDwz=x3W%n0Sp>yMshB|lEL6drB2yv;r?E`FO2y-nu~tVK+re2@NR2jZWD0%;EHh;W z&@H1Dpdgk&u~CK@GD#JdM7Z3^Dwtty1xSepla?7c%99j2CMP9RWH1x{!X_1B=8$M0 z7zQ~e8?fg*xFtPcs3wwp$4>yHNC@#3q*rM%-KbMnZo0&`O)IOZ$Xj9*O9U8B6wuh%f*a6S z(PvYAsbf6M%e7k6aE}S)Ay0oH;pM*P({OGD(M80vTtj%h!M?Dj z5u>)69gt3HPt>volZG&(1hFi!xhSeEu{$}TGNg-TvPKp}cQ=HVBlOfuWVJs9c9cDf zEJ`hnnUyO?bju{W;KGR8>pI1kz3+y}WYTQ9>sK~4M#YNCWw&oqNneoW{QYqM8CupB z=46oe3_&0$n`m2Mg+IU+CpnLZNVhkL#aA@_3YuuqHk`Gia&5Jn4T-cGI8v4>%2{gG z&StGyeEyfI-13n;WLR3A9UUB;j*Cwsxurj;7e7~QFDrZTJh7GkBcFYY$&NlupQc`L7C8u`jc_)0ce8l0r1j^6ia zxkI)%e;2DwEbR1q!hO{L-Dp^d?G`iuGFcjF5 zj4~9El=jd*)kBRKn&QnRNfcQwp%^JC5<~vhV(jn5RmII^vlW=|jlbRVJA7LtIVsEB zt4aC!Tfyphxt7(jUC$1G0#EMm6Q^n!=LtH@-C6FP8=h|0?evYVfE@_SmH+$dY>O5c$!o2-!kURgjG(bW1p9Z#DBOmOVOw z2^9hbKmKNjXn@f&$W#x8rrxJqcAn*AX;0N*)UT3c_1WkCW84c06bc{lAMy;Q<5=0H z#LVa()(&0C+gj92sOv&9$t2tr5Q-Qg0dYc5V6ZyKxcN~^ql(%<43Jd&gHvonRcQK!f5?rVvjMqcL-2aJtu2zx zhlEO{JeV=+7+PPyiKj$2RFWIA#J5i}ttAdixx^AHNN=EAoLxq~mG^jRMWVXoCxP${Mq(>qy$R=zSK}`unRKXHi z8A_yE5-6fZ_8hEpbYrH$U<{@WXQ4MZQwGrZ_~!6$5xC^ZsTBiarbP14h$wI*!eNT!nyWrfhT_7$$&WVqTt{vNIIghJ?aK%n?pJ>~lAU(Q7ey4xzCOI8s0k z=xAglZ7gC^aBmTUwarJ1)+JJQ9T3=|^_yLfU2uc=IiEa%g7>a~q3@p=3fvgG=X%HoX0J@Yj1q5JA5=}yJ zLlmYAlISRmY!hH{SOg-cXP%d!LkLJKQCA`diPx|u7h;=WV8JSwKrNz?mf{gv3A&M{ z8FVseH74ECw)u71lt!^ew3f2b6L zlua*+jazAY`?rSEP@gi9{#o$Km1Dy4#2d1e=JwNVYV*-;B3PQzREuE?WS%FkF|-_6 zQk7j^aU3pvOyJR-v_m0943{zL=}MU>X288in`7Gh4}LWCRc{A>dQw>{yoXr;5P6VS z^F>1^A=Ej<-boZWK1h_FW8?DY^4upyGrB#{3m~mVNJ4aWA69_i41012_WFetR&ViR z2?d8)0MRr$6*7+GL!EpDiM#1ZA%hXuf^y`xeHJ8%d8dw zSX8G5K*QGW0l${j%~UgCvv_E*U~AY1glvRF+8fX{5jHB0!q))ydhj-Fq6nYPe!*ar zl&FW?(lZhk{=(Ciu@m@PB$t z(jo$rGO19h?$m~YSTGvGhX|K~QDWozySSq~q@oNX@2z#c+sRNZiM03Yq>`oBx0I-eT2@b69=;Drh2mQd}X=A=BsI+n3~8J4f2j3PEzB$$yY z&m5W!&N}PCp2vzmWB`!0$J_psfruYIgHOtG91Y8a&;rRmPXsYoQbZYIHZYBQCc{(R z5ByeO)(^%xH&I@akc=k{`9Dl%gr)s7y4m~0!U|ej9#K3ONg9D_p=7ebWA&)Slys5O zrKMR^mW17*vT&ruM$m6b8j@HfGK)zPj6xAWga-rfG4hG5exP|j(WtHj1J1*LvX$V3 z3Ro}a8z?_dy{jrYPPp9K#b!u{u0!!zY9syhj41zEQgqr&MYP$oN==HF@_cJsb{B(E zr}x&#qHpRONI^kaMUdS}76l<3JXe3Mukx?ISH{}=nzV%&*3wo=(qyd^nlx)0S*EE< zQ)IS6$+j|U5>jn!X*M-R(qv6+RxE8rsV%gosWp(YZ5viii&UFzRg$z>dfjeS6t3#p z>TQa&vZ_srl-ia^%UMpAqOO}-lUhx!in5xD+j7@Pr8Q-mip4~glTo%(sb47Al!(G|XC}Qntq0xoWzgjEJy^k~ETnDYmvmA415i84*}~9m-~y2x`Ve*iT=lt2s#{ z-(adOQkFR-#jvSn{QZ|j#zri*>8|dI>2*h(^TVd?l=>vARZA5jtVwAW2%kVDDH#qO zZK@qH5fv;=Wi*J8Mh47?&q@ri&^FM9DOcQ$^#q($j!@PuTNIR~MT(Z9mG?uGXD6s& z-Bm?V)M}1uj@cp0FFW*&X6;85QJ5dR)4=i(?+#uPa*2>KYozH67)mfkGG!6bvut+Gd=imuei7Ve5k&qojeb^m(kMBXT0J)A{*hxF!Q1Js((`4wVY z-f@Kv5TXGH6nqLrxOrg-`6wER+cfk_vNefj(9vDH3`hUQsov#P|6QMxU5YzHz6Y1N z_mltyKp*cPH*djy2_k+-v5*hiQBA?5pFhKopwH93(a$4hco6P>^!V2ZJ&_p@2@!$w z@20F4P@d>@8HX$_O_hA{jo-tki{k6)^ZNJS`^hnxWXcd@M4-YX2-(*R%+0UwA^5mw z)r_On1XHUA{^Vxb4K>d)FeGG;*ny3uPziIS667Oh5RDMD?3aKO>k z1OM3uiSxngET%{2%i(4S>kszKv@$J|v%bA>7lE=)g0vh{3GM4Xp!~`Xu|dm@@X62O zmRVw8!E5SkLs_P(0^6yzF1DJtlIqu1-L^F*-mQZ0oe}7kjz}{PFZ*=~APG->qn(J+~ zwYJ-BsM6b8Xj<86MJ=Iiw%cd%0wN%Yf+8i}o286mc}SqJu|+MSdCC^kgc_RrIRl-7 z_q&1RIx!m(6h(;6_hJ5_^ieMIl8=o%y&SSee_+GWy5XPFdziIf`Z38d&BC^mv076W zPsko|?EGy1yFZiAp1vmtpEekhWg%r!j9s?dd3ob&!Km9sYBWhm3PD)OML*^Z{O7qk z8ZSb4Y({AK7wgS`Ni7dqo{bAg5FkUBoRS?1N`+-J5H@-Mt-iEUfOvIOB45uB%&O zM=FNlzM*G3f`Z6cMvywxeyG1B@vDeY5d_qfKoeLaP+P?UjmSwA69+|2LIYq8K`_Y3 zM0zL(`raGUH)#tJpTPbUfv!mM^M{B-=_p{p@I^l~k&;Howa2b09b?Ji?jyP5zCA;& zm&*v1U@lBdTB1!wNi|Z?{>k#*cwOA!Srb6%JP1=Z2!w#ga?w86mg4+Fbr zDu>uvgCmV`D5FClr|SBTr$v4YkTy|76(RU`PQdCT+YX@2nYLYlID|0~#Wk`#SH*_p zEdJ=(Rt>Akkl`RjN45sRdrl3 zLm!*Fo9WcD$9;uX73WO+>^5zRyHo9VJ_AU9miu`pCKQP=qNK2x$&ymT1Mi0qbm)$T z;kpxm@JkXED2T3aDm0BNwzNMox2LJR9+FBssS?zIY=nPthoktGF=G$&(nlnYoHDFf zQt?stU$te-Gc~BH{w&D`^U+p}l$8kg(H%`!M2=|N_i(`VSdYR_##@=98q?uXr?Kl*N#!lE zZO2ncTO!z`%!&l4DHa69r{cDLWG6_#d5~y{)*^a<#iw99AyGA#=kw)Zmgvan#?LW} z#ucdQH9@Pso7M?DMFZzz$OM8kam5kJG9cHj1K4@`9n6CFFs|O}!a^6?fS%}pFolof zK7&%!H-EHJLL$#^<1mQ*g@qQo%36befkU%mTfrKO1w?+;NFyv1RI6jq^s>|Br@a`; z`(FJ^PEYZkC#+2+M4$6n3GNUT~J6Fvzazx8=qC-W%o-}pupvZX~zbe*(~ z5Xpe*oBtYjk-|Yq@(`$au2+E^L>j0RjSUoyL8=mvTrL8HFyUyrxFs4wAP1~kFSs4w zjSgQ^pt2vbGRTtI7WOMFRY=M@f2Ho8DDGMP?j6q-;$+C3N0!khkoogR31R4YH$H@f zcYjIj=pE8el8G!u5)e@0cM9+u6MA>a1`&MXdIx(L$L0$__>_Ri1&Q{ng!}Ux(1l;7 z^u8pTGEu;`M)`iP!HvRodyX8~AOuL+N^#Ez8Jh?=Br zO(`Q)7NEo1jIPTv_`PJ)%gF1Tyt5SIAJ(jOI&>{M*y!C}GaQ9VPW{?%-YNO5u(LV> zG%kbG54eQLJqT|IR(JIGkG`x~R$5Vhzv73d=i^c#KV?uu*4n}-9g+M9AD7;9I-ZGr z3Fq-l8DXTTN;81KwG8Ya#Mj}GDC}O+dCw%n=45I$%%`)r4X31wBUDgOG9=6>Pn08q zf~E*xCwIMrV2b~?&S^v{h|_j7v$7=Luxw19Y`Aj&052|+ZB zN|4t)g-aF?M8d;?1uPgEm|ZzklV)nuPWR?it&>d?6pBsEV9(fZ4EA97B6u_q=_z=S zlLQOlj0a=L7^nNm%%~siixoQq90q>JNMB@}I3S&+D3pbrGc1}6u!b>>2|}3g#yTP; z6OkY%g0P$$7}o6-O(^kfhRNJxMCk@3Izp6(k`AQ138&(NnUQ-kwOpVX5k6uVogh)w zRn~R*ZM;W-B9I@IK2TA&L@0m~*MraZQ=U^ng9p*?YOFNTz z!K~I&b)4AY9B`Cj6b@j4#8L=t7jDY2%w!^vcSI~9uDKMMk;bV`_!y+7i6QyK&`2J^F3B1LppbzM z2;0&6B19s>Bp48Y$e{B&6x>|YPW4QWL_Fbm1K7_fdjZ+#lX)N5r?g|!@!30$!D`Zz zS&(3>BJ5zeMEDU}gbEl!f&gJap1<31Ffhc5jD)r-CvwJ`m`N0oXW;^Z5n%(?`LZ89 z%wl0BB@LQ3SeiZt>defC3I0d^d-_d}{M6%`OE#sg(cu_6?#bCzQue`_ZW@~QZWu(U z=g=~AXR(6GaB><>M*}7~Nx*S>%Yl&rWEdiWlZ<4HGYD|J))IGy6e1DApe#X+DfJW6 z=P4&g!UeKLA71n(5e;Voo436TjODgTNog!ZJoQ6W${D!RAE)Yg&U;qqGm+12OR(xJ zbw^akEM%3VBQsM}N*m66fsNe-h0~uju zgT1pff#Q=B6TdvdN=n$WBqqrxIh+-+wFmyCSsZ>_mdwjzmcAEPowY58oYFi+(I&OSFb6 zh(aVJ8B4c1LkARW`Obo{V91KgMI@U2+09ot`c-zU{!@B7vEtz0YgH0-Vb#qoywAyW1;&#<^O41mq zDp^@wbXu+1w>I5K+KrUkb6nO~_V`jMUrZ!AozBRfZtuy+!TUVK|2;Bm<(PY~G>8ZuQ;IBg-4 zyg-7yX^#V$aF?W5$D3Bq4s>AoLiy}y8Va@@XTTj4{gOu~H@Z~#BloNMk)k z5(NM}DDR~S$UytlK|b?6hPyJkqfw!vQ4>`l$?^&4QbxwM%;$-UxsUyhPX^@L+Yv|T zLx!iZ&ma5v=WTeromv$}%={OTHYGu}TExbYg0!tYKBV@0N%T=Il2}zOw*LG1?Z0NL zFQWZ23IfJLNU!QG&+0b6dpt?@w$|!qRWWS+AG6zUDMs3C*|D0*N@k|hZ7u!$*6SuT zWm9c6npo70jaF$=+ER&0wn}R<)$(m?Yi>zVL8)wOWoesDw5^quDN<4?Vfi zF!}PusTb4_xohU5i2$dy_UI79;QYpLl1VK%u~w`fnmI_HY3x*06-Ur$y@B7`TTs;i z>PVAfda_ff7@QRL5)Ml$g4kOm$}wPk#OQ||VmvYrFl+WAfOh5(x5WMl9bMu(4UnU& zz&lel_Vos2vvqRHu*8uvN{~{a9J}5N#0TxiN06@XQ~G!t2{0ZQv#7@PRg5tGxApDI zcPVE0(APX|B@3wPB#HT(kYZSPHWL&#g%Ao95X4Rx=7xr%Bf>^S1Y}Ya87Bk}Ic2aZ zPqKlI_?yI|$b$|RP-8&G$S86!#|tI?1KvDOY%OR(lhDAJo=O5seOr(!Y+7s5i+DEX z$Eqza*tY6eL(FnRtZckwDi-t(o*YN%;5;elr=rMEN|1sP%%yU= zmclexnEAzR42B~SxmH&4j1-cIP}J`FB-dBJ-ZKu*W?||T2nI@P5s(yUbKrEK$9{-@ zwUCm6$)t-DktCSxu1N4t)jh-nJPM&p_!QO!sbn!rWz3dY3WLw6Frk?8u?`%1<-+Jj zMvY2hbgU^z-I0l8j(lV_8k&yiu@2~*`OJ-quF7Jvre$JxI<(d()QQZ%yiIUj38@6d zhpV3g*MDgOkd&||I#nO+Gt%_Wt9HhhwJvK(D6$Dl2`~KxH{dkqP+A8HPU9C&Jw|p$ z6%a&blM;xa$uy|iNkUi_5s}5jf`l1zGE<{ssVtC-_V3>6Dm$iDpq+RU)PV^#!P>PG_m4gxulytZY*}%h#0S97p~sJIzSj*WhrT>cryr$^h!ggVaXCa5?F>|Id+CY2C+hgA?BSr zL%r`#761Y0(32??5TlVKl4O?peBn9J1Rx-YIV~(PEkCo!pNGeV>{%I;B7LZ zRV3ZG`crbr7?%u-BE(HI2ExWkTLe=Qbqt#+sInDXq?rg^H6Ruc8;E)O9p#3_&;cKq zJmYIz_PU&3LhTO^0qj??WU928nF^LNED9pBNg6m7tGT0s;$3raTquI-4q&G+>)7g; zU&BoZ>|_=&X;YecK`62yt_I+iNS8K`cjS{NU6~WTKvNB*qo>Q50BwP5i51Rf^ubM5 zht0=f+CxN#R9)<9iaDK0a#&P2mRMXB+$Q=ho7D0%Sqh2}-tX{9!@zel9+)x^L{htj zR9WNSv70gDVQ+q>EtTVlW`?t@urXQ0P!vW(;edPu#D-zW!l&f4=^figC%5dAdu%SV zrhXjne-D@N^S^B5SyM|hn|ZbZ@dslEj)Go6y8xJDs51B(V z17i=7@-sF5>J#X2NqpB@s#9F6^tBLjDd_kQpQwCxP6s|yL$btkU56QE(=JXCFlluR zOfrNfQ24u0veKQ39Cv%HK3Bj~1N!Xh5$31~Si`4$C%f|lDBEGfeR95@~vGd`%Yq*{e) z9Pr?{4;?;M%F7y-dzc|`Fri3rK+PBsj6fA7rvcy~6V|H}67*^v1`s^vCLNtIDT_f8 z;fHxyw*vs~NEH~#L?WD}3KZ-cLkodW(5n-W8fziZQ9TUWhR?S0B^AWdneBm`Un3)klknj=WQ=s^e~ zkccALAeO{QFmjGqsboctZ{VkS->1p>pM>kFOI@|tN=>CCNK_aR8VMGfq;b+cI0c6u zQh!hxon-CVc5fg3ot)1~IUnl%r>JH%M*Dn^qU%+ zn@W>9vC8+T=6eJ94w5|jaXQ@F=$jEyQVi|*e+IWVS&kX|6FeaI;4on!B9KUczOPvw z3AC7s*~^sJS0fo@mYj|94h1&WNvhW@b8x&y(|y`gWs`wF60mfa+0)mfkS2M#Ckw_R zp2ia(kVXmUw2=T3GbKcapt52;k<$!SrOLU_X3iXwc8S4FauaM~=mFt8ESH`gEb0KB z9tTeF?939SY=<*Z&l4Q^Gj(H8n;dg-&ABj#MDj9+Zcj|Z4^xSv;W&JDbJ4<_c`@cE zp2F_mO5EMDKgzhHWZt0JX}RTimBVwAEE*Y$DXF5YD0B=QQB3x#&=qw6(jggAhC zgTLXiK=?%#J$y)Eiy_{!YQxsK7FPCT>=7Wv0jmZHVt!wXZsgzzAl0^{th0IgPqp@t z?ZMBja=HrAziyV@n@~jrVl0wL6iAXO0Y3TmLd-ME(txtF z#zRnD}kXgWlLfc zDY-ZbFQBF19BU;L>+^%W4n#;p&*T&>@Yrp%escw-^?eMB;C*00SF|{CoDiB3^=+`w zvE;~(NaWbUS30+?EjlcBK{eki#c{83tykx)YSl4g96Cd~lZ-w=`l}O>1TO(W!|#r| zLlWhMPFHpYSt=l&kHm_`Ac;fJ{b8`P(t+tkCuc{v>sQkoRO94qD1bzz<=+WmCL~T4 zP?%ROEGCAO4kz3k`k%hk{zoODhWg?pMjT{}i69!%CS6b1L^TU85tA}pOT+}eBvj`f;4?DrEWBA42YX&$voOEhB21x zNLwx0Vd=eE%t56C6~-sy7#StQ9e(pEieaHXQez)?X%RmM-X;EX{vvrVIzgr0&Z`9k{Zoo`}rM2;s=-|=kBB7})kDIEIGKe1nDCMb0KA6Hd zi(vvJ=9Wp}KTC{{G4H7%x}wC~{fmhBkoz5SJ>3{?uB$75V=|jcWNe<=Oxq!+42|TR z#HT_}qdULj&K8F;WcY-&fZ%1l1_{Up;m~{sdLjf$CR53Hfr&6sTmpjdd*Zu09%NBp-858~%6?D_*17{z1sIMZ-)f4l>>BF0b zJNe?*91IhX8;{bNzp9`>K;fj$WVbXlvz9y{nJAl=>YP7=rv>)ebU03&q~YkI z4+{~WK*Z;x!$>gjbAZM|?oOMWL4q9;%#)#c{hZ`5Q>9LUO~lydl=wjIymp2SLX(@J zI9NPLQ3n*tZiQ-DrndezxZ*f!KWcG}n3=Mf7-W;8$dyT|*A7 zB;NJ-PBD!5<2=1zh?AZw^#w@3F_*+L&prLjdRj z!S_uyA0x@A0$@OV(ZI})*%1sI4b<1qPvn*JreQ*Y_m8vFy8!>9wyxem^HHop*wb|j%8B2Teya8NA!TO4xPU#kdp zReJ~)#u4%3Uu5MlLqNMeSUqN#DE+3T;3f>RvXp&)?IPrF_y{uqVwj;1R5cE8+&!PMBj7=h_QZ;9-NjyIMk9-2DItfj+-)Q_ zO{9l%z}k-fc@pJ?r}wdwd(TFFmSx#q5*|m4&p3m#vm#4kS|wDXSA3A#MB9-2YpTVA ztJvWaq@4rXRZ(Dn0zhx(F(lALVB~E=%2L4uh*}n~s6P}ON?@f5X2@P(!OF50F&Pvp zgJfQFA&J98pipV0B%>s#R0yPzWCFGm zU)V_xZvg5Dj^H>|n3meTU2>1fo8EtgZZ|f4D&Rr)vG^l%KawEi;fJc*SQeY!fP&Sg zxdX7(E&lYY2lLkMpRIDxr$HhRkooH6lnjAGln zPsl*pde4_xj?g?v14$>3jYVy{#ypwis=gLKjpc)X2EBMv|Eui$@dCGw?ZoRnsnP!5hkltVdy!hxc#uvkiiY^f=!HPlkmX%nboJlK6A zVZWh9qtxFPlXXpt^u1{(FeXPf#+$M4`40W-g$O>R4{OwrQtQesH)HFliPYadX5_L?QisA48j=1-h>B8tNl7@S!l0(}Qo~b$=huV`qX-h3S4*iE?mWih z$^H2UnR5mZNnV@D$sCxU9i-f@4h`#!$jdfKwRBEnnq!mYB>I|yuogIMN?Sd8o1u(1Jfl3cO zK_FaXMcq6b zz`QlLoG_f>d^y8W7?YZo1J8OLld0LMH=Lpzcrr9$b}8m8;jElIOR0ZqR(O-b7~{3P zc0cVfo6Sd*mK0=^7<&9bP(z-sCrd0M`F1}-A0ZKvbxKh!C!y&>=no;o2A-h^Yu|V| z00P!pLu~>(7Rf3XMxQkGJUkwP6#o?i9h4e0oJiXNNQ^-wehWfj;pz9Z+flt~TJB_H zWo^jBI&w{!t_6aTbccmC8bb}FKj1B#@WebR1H)w|`?y{cVZ3g}%M`jQFuI~BVG$1v zPKn2H#-JOe#VGL6GgLbQNI=#huZJzH6QYN7BFl0l!kwIfIvnV5r%bUui7XR7^D%;M znT#ehT@@@5WtAc*beYDWs7DLH6P4+v9@3qd_enJ2#$JQt!ko}pA{`uPS#0Q2fS3op z40NVW(}ssfe^Gs;>B55o!JY_uh=UJFF?%HNV0jEnB`*vb&4fq<5E+UU_-GiRExg4O zA>i=VKr1v7aCoMM1U(khIjwE5q90HT(j5-T6LidTctFQ23!s(| z^c^QOQ$-2_8DN093kpIdG9CDrxzL!f;2yyt=J43!Q;?`FV#o|_4{bejFqlM)hoz=8 zM3fjx*3wjw2ol`Wsc2O*rG`?QiFzwiEK+^2p|HOyacUg zB105C8-g4$GnqywjPD1X*A{3V%vrgC1{QUr`roXCr|xpyup3x)v6d2KvPM!MEC4-g zm@Eki?|1tCJdIZLN-(9QFllNK#-toXz?h>Hqanc-9XNF4{ zT7)q}l6y3|Id_pKJDMQ(T|-go`d}i+%PsU?pFU59bnGY(wyP0{ihNThQ|m3tliV35 z6YIWF$;wh&7*|HHm{i48IIMJ2BEjgJ3}9l<#ox2TMhAzAp+l^nW5Sl?juMAVY8@Fxz zWj2ymAC2j>yso>gbc$xlWTiRMvNrZ>kB;wINsV^u={2j8fW{U?nApH15VDp4$q|4t_B=iKI!h|bw4y+`>##mD+L)hxib#?fXv7$IAreA^DZ(6hxi_P&8u{gn*Gp0&B3gWyh9$<02W+?+96- zp2Rda8{U{<(1;X5USmMlL@cCJjIe@Ml_~KlEHZY%fB^Z6q#e=dia@CdNt>FYhN94i zh*}O>R%C_HunkObd9MsZBXp!*MJIHmtgKMdQo%|vsZdKP36m!f ztT==W$RcJO3nHLIDCE&d2NFoRB7~TL$pGPIl7)#F%FHMyB*o=hppcw_4)+Y=PL0s% z$e3UT1UU?nVzk3j7By1~5i&-hMw1H|Ol)kj8fwXtZ*(xJMUgHKMp-CXg@$QCK~#h+ z#sbi_!`7H(k|$E3RRvO7Nj8MC4j4p75n`1@nrWIe#FGtVGTRztxMY&mh-6^GHZ+F7 z2N6#&Q<#=5Duw}oa4$=0G03wx8w!+UC@RCh;4lRl_S%dN?y6=R-L9K$YE5mjmA3q9 zwQ{!Jn^x&QcixG9V_AZs~`x_tPu#o3h)MS>eR&_w11VS{y3b1c6G>>s=(6DyhMw zkti*J7}>DK!6o*aMdB+JL?{vVM5!PamZBnQQZS`hHTKO-Me;g_HxUiuRV^ioO}01X zmP)$9wx(_Qa=fP7UQ2A*RMToEDWux38*SNDC9J8d7At8s(w0)&C6LyZZdR_Ardnp$ zi&D#57PM++$zQiOO4%iX^>*bPon>~_b5v$Q0W3(45E9l2v@WDBfn#)y5n5FX1vr&< zILJds{YUN1JdLCbpJKY|-IZ8orF`~hMOBPQ?OX21WGjd`8d{)NnISo_Rge@2MzvCw z*|OBCQ6}3PZ>wnKiNkz{&Vf3>7D|N~2~eq0Ggob8T`p5^Ybi^tO^tGvX-;=(5ynkv zk`^iySW&4Y>c4G5s#_wItuU8poKvDkog0!;Ce1|*iQ)HoyOA!59=aZtF^}EJ;%6kK(_2@gIt&r_f*jj?pNo}x#N#Q?5GDi^jjnm&hvAO(a7+F%t zsIpOEP+(d`?LRL=d6{n$&yokIi~xu+QUq5A0OJB~iD7LJBvPkI;OtWe8i^M7RlZ|= ziM;E{vQm}mYpg&-3<#kwKOZFIMj%@b9X83-;KL6=J8XwU1M;A6EOTu8qtX;SRB%H zNS1{f5R73N>_VDTY})nOnSjSL@km61sf$` zvLM9?+7t+hCm1y2D3lU|p(##j%@vJfYGt<3>T9WDm#znij0%xrEG(>ol9aL~0^Qph z#Wb?Uo7AnkZAxpYT(XvIxm`5XGmRzGDlH_Wtc55hK!8zV%)wx8)>h|r#Itoa=~+r` zUJXi1N*RHLWh5#{Ac+u0Efz4SQDRBrdJJLdm*Z zG@+)>vAK7OL!krNnnd3LqMnVPv5y zPe)aBw>C}uGBOI{5wty*gSua7N1Jmh)tsmInrafQaL7HA_HSaGD4xUWqQ0yzPE+Ms zB>b|3lt(BnEJ!Bl!54wc^|XS5_C`Vxlh7BMc39DP1bVEAyd32EDB{c@C|8)31Yn<( z8tdEjXXyIyr~51Hbl;J(sD9tU*bQfia(Mg{G7xP`A@p$pQA{)pQh3yy=gYJ2L#BMI zXZT3KH1d@HbYwQZ{+eNTWsp>`Dgh5ZEi8}y##|tVidHEjZmf@yc95~YNtVuRaBlUn z%MyfaM1n634kiObt6$`@P{Fog2HoIzD%H1WlT|tX4y`z`)nMqnsk)u460G*rMjqUo z7FF_D_LezQV@gdd%(3IRpiD2;-B%00soa?b9+Hpn$frhFi8O{MgMk zD#YPP%$u?BeF|xxrz+fjCzQD$lKHo1)9+QG1avyXopT8G_50ABNB`GOrNm3&K zL0C!LtrjL>lf8du3^=>3knua*w(?yTS}LTp@2H)-**Yq5FpkzS)@=urLV^rzV+ooU zW|cy_aZ(W=ivna00R$nD7%UB{IrrW4T>uszeBAf`tmIV8BRkPEEW_gEIuFAySEKg?#vNMIz}W_ULgMpn3*l@Mk|QZG&lT zlwyn{0wF*^!H0gh@U_Ts&kmM0th-_^47pWy?ROULySOtn5YD~+FYasZ_JGhd&2EZ9 zz&2@;h5|UHDIA+ySUCgY$szE}k3eLXq$om^mJJGnMG;y=3neLoa0_b(x|qT8-K+a`#b#P)B5U_Px2>QtNt?a6vYOd zrm0Iua~pssJId~FN3Yf)GZsjYjV=5GV+Ea2-v@a6_H*g#%5e5eIV{E(42JI8rM9_u zI<~s%>Y6bWGPA3?QcYDVDlDR+5MJ1f2_Yc&5Jfds1`$x;vk4+@u!A8|EGZ*UoFw16 zhp{PzKH&>aqS29h5+TH;xDbbCr#WN9q2Ifd!oGgbJJPT`?hwOyg7; zb}-QCEGq?I>RA>&w^L&oCEIs6-P5~cZ0sTviQYn-s;r?zgA_{*5)h*oZscfj0Xz06 zQxBNjx5ORPNfQ2V!3|&~7V<(|;MT#_LBb@f~Atvtw&{-vqjtla9y^Rgk z`kBEx2}-q8k?fbUUi?Ad-4;S))k&wek|1qR)z7STa=26=e|GCN+#{G;kbUAwx*D&O zRGVH>ylrafp-M?Z8X^HpWJHH?qR==~(V?3#YNlB&ik1~*VTM1KKST1`H&X)@`3!Ya z2nL|?DMN$-kwJ>qgIPAFRVhQy>0d_G^i94GUyU1j@LEU&h}5__!Eq8NXhot7lQd)n zho->^53LF#AsU4sDhJS^dg2fLG3rjjBtj_00LIdm$v+OdXvs-dB9SbLvPxMY(UN1T zq$4aX8nV^$RpUz1DK+wIrY{#}x6YR))ta%h5-&TfU4KJ%zb5+r_F+;fWR{sJKFHY< ziiqb%StFXG;E_p|3uLmA)Qu>y5+MbCasagZPp-u+fg&&>>cTl$Ct|!egQvCQl1j^L zJ(Bt36hAR?l3H6Nk!64@N#?NB2Gl~-n-OeB9r7QQ6T@Djr{P&@ST@RPUz(Qc{LQPz zyo&zB-}J?7gA(ali=sX0#C+yK-NXUtfgQGD#-gI7TPkT}RT-$X%38(sYge+`zWJ@X zZKwzdQDYIx)Gr$}6?pS0bAoJhNW={q?LjPxuJ{raBwpCu5wMaw$%U2;>cuL_5?XN| zv`jaGt@Bpe?WwgIlCnulNd*ZIWDieoEy6o~edv7A8ebGs+pl3O4(D@dpP_exb3D?% z+C5NiiT!7{CuBLl`j$rzn;|mG6&%R0e!s-|Oh&xhOLtGAQJ595pwI{x8*Qa5e)vLt*Q0+I}WZk>lX#nX{^hCz}2J1;C6q zuzW!MZaV-$M#NkR2(V>Fb;x5$G{kq!hC6>IO(N9e5y~gi1i=eCW4F*m`Gd7nvo6v5 zC@2UT!x7FY^zjXu+YHL~nl@+hdH6paX`}UXoZ}g`&l+==f?i%V^lQ=YZKdOCtp5dd zSdsCk&{_9SM2}jFEQw?n=Tn4M9N`%Qt45C~;w@d<@y*P<57@Ye5UB$;mU794SvecX zo9=62y(!>uISAiJho_;^%+LJo<%k~3pj#v>20N#KhT!fNus6YLSiv8I7}v*W14MN;(pJRF(bJ; zDN9dOXq)@$nlV&Hwbk9TNhq-h!5E>*Jw6mwqxEmrLa45;EOHE11M^_Ac@;b_g*cqx zCwOUz=CjBLC-jIEiQP2;#iWI$qK|nQ5rR0GK#t&1}^%uA8J9Rn9BtVKpj1mw^ zrjVg1sw}crVq#RAeojF5LMOx$BGQ}g$jXA0L4rVpV!$iK%Uvavq_kU7Y*d!mDx%la z+gDQ7u}M+2Rxkphs(k?kfdE?wm|@DN6%DZo1P=luL{cnaH~!Am)gVX=D^`1jW20%Q zEYlGlvXrpZOJ)AE50b*AlE~$|B}z>m)5r38^nIC5O@!e=g-%4^h`@}7I6*NBz!agY zx{EStO!+m8X@UFA$mSWqb5BlRdBd!mqjfqReOIB6Y^@)>t&K4kl~CS{C}9v9hua$F zys{|mJgX6588V`&BM-b{HDv$3q@QA@l-Wm3!$=rp0EC%^7%YM0^fQ!l7(?KaqCfIoGm^#H*frKPBv>YY`@^^>x+FWieg) zu7fl#wv3f1l7ahaDyXi)3$U`NaZs}b1uO^!k&70?-XRz2F;I)nvP)HGQ)_K)B;c#XvEfPhv@uq1Hkg$x(Tp-w zT9KC2VvIcL=BgPBO%%!uCTMQ_|8z*0J%?Yaw-7Ec6%rZ-JaOmnEI+rhXVJsfR1jX4 zVN_T^MjWAC*{x-FW_E5t=Pt*^;1V#-iMUb zX<|=iI}Rfpw&|s+uf6v%-dMALF9h_ znhFClJc2f2vZkYZZ7I%!ppdbLA_(GP3{yBzt)0?of!P7d_LDQ~H5phk@N{J!*rZ^? z|5Mpg%F7~|AmdMfpobC-cI*j|b?O@DX>W%?*bx!@Y_%k}Bb)0X{u^>RZg$=vblFI1 z1s&B#Z95`Vbcj^M8773m*#^2@lc(T5S@jP((ZzC3&W*vxM*`tA!Z376+D8)$4`LyJ z{~jg+Xvllc;n?-L5Y&+dIU78YR4P<*gm@Y#rJ~rfNP-0%451<=5=0eN$a>MVNs}g_ z@!jWmZ($qAbzq(8CrF}EEK4HG5?Ev;aVRhwHjz|YYLuo(&_+}W&C5G=tgK8mqe+>o zZF!05J#q0d&CN5+^Bi{`cn9##N=eZG_+J@ZM9UAMD@zkj&MxS~H3isr@)jdVDs~+0 z+EtayI<$0PS>+q1jfI3?rU|)bg5Qih9FE*MjZCslm4-^SQbNGzm1vw{?5Qb|Qmw4VPilCd)(=CDp_#W;w8n79M%^)fSxL_IIKe{?pv3C`luq2+>=6 zRqVPru0xt_;|4?t2YY~~B6qPH_1!#MPP%TAIt>n9$I|}5?LW(^u>zL82b{MBk{f{S zScAqGbl~I-pr?YEnI(@e1|hXM_3hWD+?_mP$?Sp1Ly~AAKvrUHyU?0p&J-#sEGV?CMK$?bR%q(D63--X-R$k!UsPg>(X|!~Qt=W$_ z+7l`#K&0SVKnH;8uFyyaJ22LHrv5T%d2}(^Ql4y*dt5t|wR;VyTMgxbTtWCzyVb_m zaoTL6-`sk2v^K!afIHQCcg-qX^?JSSr=am*`Ma2w4il-w^pHm4EJiCLgcbroW}n(< zNg=IK%{7ki1fJY5Po6)@bb03RbR)xh?{JnTDR)b+}2`Itrp2^McQq3B>sU`D8k7+ z8pvpg(-369$Rik$hP}}KUx-zSQi)WFZCWqdwW56%Epc$D%*cw2BWWa?^yeoX2kTr| z6soAqWQCKDn=FS3JJMOYHamUOZijPog>6#DjxlMh2&_ci5Rye?MB#8i3H=M2is$hDF3;vwUebF# z6_YYcdM75ox^TEyHNH(Ym5TK4uJ`JLQSI4t49sRz8EmLRrHr#uD@_?9Rf4D*h&2RQ zL0V#=Lq#Z<7$qlFDkZ5)WU7lcGm@|YK~`I6wdsUpE0xP881;LbdN#sWs-qIwN~I@`b5b;=Dy&G21R7w3 zdkPw4j9}&zhXt|&@E{=3D56?ONxURb<*BzFnbE=ivuvLYk{_i_lxA&q%l66oxSOi0 zd}9wLCkN0M49+G+@QK2yEh!uV2Wg<4M97efOnO;k1|_o~t64V`*!D{$5c#s4 zDO2XjMEs;V8-zn?5z;7JJARpz{=V9{hH5?b28VhAKN=?wb=}rJqZqslOi@5&e?|P$ zzz76n0t`&Hq0SLu2?()9DsK-WqQb&^AP|U$QbCb0v-)TRU#yLXu-mF_4tt&F_Gk*% zpb!%WcFw%LX2++n#3xjJF*bx&5)9aAY}#P@-%Ur)spVr@r7*m zIU6>DLy&U=2*>e%xu5VtHY$b;f5MObaYfhtaDV&%R$-6(zxmpov+R(8`bZYUXZ=6+ zC;!HO{mA)2I~X50MfXS0`ii6i3y~-hA?l$hvM+DAILS$7Ud0Rj^d9C0jsGk%U)|Fp zCY4r6KSOp$=Pb$-BUVObZF@~uYHhc&ukFm8Vb(&V1&bsq3Ul!rK|taX41q9G%*i|G zbvS#dx&>_&C?I_1Ly2^6m5e;q&Zp;W=U=K;Cfsj1T8N5jQ^-C(HT=5=gEZaH;PM>V zM2QX&5Xg$?M8Kh#!i{RQlq6Mz95ouQ+9{B#Pns7$7=E&oK#8#y#SdZP6e1?^2lXC@ zpV-YCoPbG&6oi}$NHsA7AgUUzSIrhoMLGv}e;S{3Cu#T1qRH6#lic~v=&@lPT}L&J z<89b-o^$(Mm{p7JbJOIOC$gsMiIGUF8EPR2cSRitVgggYhRi-&Gqg0$XHMI!9;vp* zOszwKMN@LUX(tv;vQ=)nO#n`0MLLNy0|44#0whx2f;vg#8i?rSCYdXxwi|D}e+vfX zV#KyfM+(K0mwCcOVZudKP@M6vSdyqI*%p`eV^E z!giEw8ViJ0dGNQ|hVWR@jv*mr%9?DM6PJYvYjRBRO4vSqDb$?I+THUARol@z8$ zwbQw^(T!FkUreJcDr8ft>JrZCWF>Slh*f(ncBQN-ttxG`)=Nukid3-+H_7T(fn-gO z{1op^%!wT0BwY;@NGxJ79fJ!W&@&-8#w3v>83)2pU5|bU9Mq(!KzaHMK#Ik*4a3ol zB2kRtmN;3aFBukK3nx+-v_C>O2E1HixZTEjN%oN5{#@y5m?H?(v^u#LV#q*N|J&BDghHH>;L(xXd+Bi3XO^h|e2s^i2?Ikj`;!nO zz_7HY&Q(t|J?><)7l|tvP=U>cL>`5RGABY?c#)nt*Irc)ZjNrwIzf)bRd7{A$d3@g zL$t$?TVh1pHW~){(*vkTzW#Cs<^%Rn`U4Dyq9;-HWaW1DYfOfQ`Q59dO8RcP(ppWd zLn{&`Q%z{q_swq51xP%F<|!Ei;lyAR)R7Ra1w>?(m9|-I1SwD~3n-Gpl%F#D)M6qB zA!v9~p%jrp7*-ok<4qPtMB&O9VPs)o!9ptR-I=LvQkR{(WTtmrCv1fvj0BivWQZ~+ z3GUVq-R)fpVMQ$|rcI}n-JLe}nEI5KD#T1Aq7-ceq!^ou#HyvF%J5T53pk^BnrV_M zde1qYU!^B?;384NO+BSn8!LKUE8n)dZLgBulSFN=jF?6h2!O_Nl^O~2boSUG=%fyl zNn&KF5-NgTLWIzX7zm>vM^LP19fGB#thBI1L=hMyV?v25_JuVR2;` zB1A!y`Qs`ujYT3vPfnKCM7df`B`#fU)!iwqr0QDglN2bmCpt1xm6a`5cKfxrRhZ*B zXxcROE|8Pbx2jaMpbx4}vk0LvK&VKv7)m7>8C6wfrHWSk?|IHFbfz`uvs}t(A-87$ ziIE6LE_`=r!-DZk2@iWF=u13?M|L>!iVo!f=&l zQ0&KDR!=7_Zj%SJ5Q$PL)tWIjtR59x1j;Z|ut8*Gv(`HMKP|eQXy*F-cV7H8cy>dk)Y?bnqo81xz697^;5rZ)37Cc~JVnAbvOHoWr zj5gT$ZndlBFM7Uq=wN%v2(1W$R2DL@X#h(?Nk&r)SeL}TR9w;Z8;_; z9nF~1XtGt2H-}dBca=M2ODJnuDI&7jDyo;bVXzE1P5=c_z+s@|v8XV522P#dI@oJh!V7<(zxt@nSwrrRQS zJ9P%hKj5%ZqScEfvI}662$3@L|EwLz|FEq2A;hDK$Je~*|J-gZS>qnFc0u9fw-Z}c z#$&GN-D9gZryPgu1rzCHqE9;jX+W00a;T!Q5-|-eYRhM>UaZ-;d(qv+GE*M(?wqJ6v1iT58(w{nO3o-;B?kQlCDu7BR8=^I=kZ1Idu`n2$l=vZ-ts1dJqA%qwAIL`gs*m!f2;M-L3@ zamtEPwpA%vlBE<$NoF>UG^wJwwRXx~bh=WyHAxM-yKHGGQHXpZDL^plNT!LXcv8|? zlCm%us>UoN#MkC>y3k77ZLQjGcJXTkuOl_tG%qI#6vPU`U`Q|%L6E{J44gEjAanWq z!;`XvdQ#z(D8isD3XG*EA`O;l(#g=YoH{39RuFEar4*QH#$#zVB?bu3P5n5HwN z(o~nWN{2Zif`HGFKZ%DyKh@`xf_Sl9lwt_lQzWA-C^`;cfRe)LS`9Dk)u7CRxCo^n zNSsKI&fmJKlF4eSze43zh3}7Tka+0Y!j`m*lPo>wx+`y_ry(+_3V9z1ebT?qaAIK+ z{(xk&Nro+svPhDX!lCUk;XT7-|BhQJSg;q~MLlPBPUvXR^sz_YVUM zBq0ek8q#L4TBb%UgYrKDvdS^XU#@Mxzbw6a)Ix|1+|O)^K086B%zrYGc67x_wL zpHk$}jx4Ub9kV^V`V`gt$1Qu~yfaD+!as1Y$%4qLF@iE7$bn$6E9o}qr#f;)MJ3U; z6%X)mSd6g7Lf|Y;0UzlM={HQ2JPONd!-?eihQ`WOo^gGi6REk(rs=Z~#Ut;wzw^ws zWOlOVDpoQ;HqmOo&{j3MTVBnp)Y{#ZRaBJBVVNYwi5OWaLlU62OsrYjlPGH#`Pm~Z zhW01f9HNARa^*?ONyKP>f&bvDh-B*|B#>ivc?alLZ8wssD$8l7oN%GFih9O7$?8+R z5KPpEz$OooLSVE|KIli}ET8JJk}REN1{IW6t{WmkR6+TOwgj3|LO>v^PW~EU6Y74d zSxer=S^F@?WcL4!)AjIoOX2C{cMOp}kcuduuK|I_ViZuWO9(~;NDM^ex%2`?!>n+r zouddy0h$KU{cVg0$M}&RL>;s_Ke`(5K-g@=DwSggy)rPwyDc3UUH`bQQQOs(B;uCrZoq{g^zLbBEih~HKim-*UEw%`aeH_u~u<2w< zqQcrt7AqMhBOx&@NjZF==q7|Yg^uLvJiayMRLY{D1y|E$LVD`Gl~+YVa55Kbh;cTE zQ~I@V1_*?70^R0FY@uw6QkFt(WRj{O^Jhm485F_|!BPLtD@uXUdz1vcX)$e+V%t+o zNYvi#wo;T`$7R5e@=+!WJ2jh`GIpspEmscH~k%Q3?oOdLEN6FtVZSlO{;o z+CpJOR8%afAPcbu280d53oSr$B$lSJ zw#WlXXti&C?ORM*(^k65wRA9YT$yhYi0`~68#{7gcw312@_k#Y>6?J5=0i1*pTvMja_oFHb=ch zsFb3qJQQN15|mSS1j1;o_B1rZ82os*8_kST$oMRNrkJHEvUcdj7^F{ahfZ^qThl8p z8@G_<`vgG*#tVMQrxc-KlPMKa4;T{~$j zZkn!=nwvGFn(CTOq^ZA-bX1L!YLrUb;dVE|RjVwOZ$LRB184WLDcL!Uj&nv{#fFr@g?!5vqSV;hQIV>*13R6wjIHB|3loMZ zOO)S^_UH0lxiLKlt=}ZfR#A*(WgkJv&2D7;ZWK--9%R9jI0VIMiiMJh!3zz5(7W$q z(qhBWAv*gz-fHqAdhW<`t1N^HC^BwCHU%BZ1Mo*H>;FG-=I#%8%xzIq(uk2ja0)Ki z)j<<OflMO_2yBIu6SmVNN_HU-HZHI zaQ)Fjp0ES9R@xkm)7nC1FBrjw*XVp`t$*O0Z{1A-jvt7W*^;ww6t``RzttYF!@*2V z7-})oZ8=lvrw$)2{x4&{klNLqw|7)>mO#Nclonw7-MP3cIIj)?$6%aXiaAD`!SK*E zAuj2=_h;B>%Gweb@brrIC~~CP9w|6=$=dGUc9Iy^HW;&)&Kz<)=weS?ePZyTr08OR zn1W-Vjz@T0oX_B8;>aP$@u?-Fv<_cP&d48;LIi>fS*%ksVL>1MF7cp(1m=fDVQrJ9 zW6eTAca|RT*k+kJwh2K75$-PrxD6BBV+IQmO%e_}_7g&97A3pGVFw&D(8)`Ve6&Of z#E?59aORt@NEp}%qnjQDgU~)Cv9u(}!<`6*%b6e_zE&O1!FYdU$Mh051qri~L_kU3 zv-Xh&8b9z;ZGdo%DIuIhjr&B*@)@9=(^2Mwlv(wB;=&AccBcwt3Ej^xLL}w(b6S(o z!IGvmh+a)MQ-I42nO}3w+cCt4yvuQ-*upahP|iT`p)kX_;JS>KT#jft*oC7}`Dizc zHk`JAqf>P^v5~VUmNHJY<6Gn2%`I)eZB59O8%BgcV*%)%SG;k$Oh#Z1JiQ(98DC8=>^+%kDc&$U~4X8Hh|dAmdby$Ee}_20(oBGYY}U+ zAqcX`=ueS+>AwF)fm!mjl@W-PVL^(jqa~isJFI$g>FaILqn@e8VS1P(e&NZYPL+XZ zVbB>1Dhe+#MleHH!@x&EI84c86EZU5=5|SZ4l8mA-xvVkT$j{G05 zTuI7i8Y!8#TFnAhGlCejbDqox;#XH8u=m9Yv@$i!purLmQ(-$z;++9SLr=3R9ub9RaI3r9xndQeSCj^tKJGLNyX~vkC1Wb5QY$o z2=(Yxe4xohfImsKZ^qi@U5<4oAmzYBwBVpTz%rAvR`9>_Nfr)nrkRSJ3+}% zN-%r`2*~5<-QN(CTQTnF)~(!`f+iYfW!_1Mmv{^Z+8Jg$w`P^~`ES;# z;_=CiPj&7{^f2+^#LQP7&ges-%47dd-hA!0-U1!PB-x>&l;GIXB_Sy^QA$&kYLdLp zn)^M;>I3W!u**_(?2LtOI3vcVNDwBy!)7vMu{Vjf2KGjlLnpbha5hknemx_B z3)00?BnT3D`=Vy5OEaW7Qx0et5?ZlzLqY`RfM8Uw?eafkJnR!$1 zmUcp^Y9Nsr)Dtaa99#z$`Nvr*oRp4Z-pF12(JfXECG{Uu9?i&c>}M^Mw20mck`uW9 zR5SMJus5rF&6a8g%@00?0NJAWybO#Kp|S|%M8Ocak_Wb62pCmPXmfc;o$o>>#~G00 z0g&K~Me;0RiHbyV(Zp~JfN7ISZLFcp3FxM54S+Iq!-Hc?O-N<5<2Tv!u;28ferd`u z_nE;a#ORJBn5BljvUWL)cV`)nnX}r1<~szQ8+u^tM^6axllfR!KN!^PJ98O8d z)3H--V-WY*L515#kijI$`vZ5X1pTgNoeW|Jzx`6dx%#GX!vPr&P;G?Ddy12TCM`PuzWF*c_`qgHN5B+7h^2Z$`EJAszHbkh^TN&_XEWb;Z3(Zwfc9xIY%_^#_t6i|gc6Ig1 zC6MhP_Ir3ZDXn0(z@DPSO|fkZeW6Zro=FM%pflR31)+>ci>4%j20_vg!k9wl(#?kP zCX#HZTB@|It+-F`bVI=V-Z43jZb{Ko7_S!7=O;G}V#e&a#61L`5RQ~{U)Ph}8dd(h z90N)HqDct}59Mg8tK{hq!H37jDN3A)!14v3Mor;cN_OKpE0y6SFSzX{$l*rDBDxFW zUXEb@Z=`z2;%Da1EGlF{T8d>*?dNIGim)aaLfvNQe#}skhz%u48YrJd1yo1ctTfIj zn+K{K5+Xt?+XGE~$*6HB4!j6}J%^)*Iv3Pq>Tt75#L}Lyhfic7-#Dj%j6=7R z1yB(Uz}$llN$RvOzI!LWr?bujS;S9GA;hR*spmbgx2L(}>C?rSL#aj#!R`bD9V!BH zd88qV&AEgGX})~MBR)`le- zWJ;rzk*QR7JF6#?26`^aBuK++n3+L@kk5(eKc`T9Pw}OCdVj&ttPx7iSD`hlD#vi{ zrO^G$03#KHpqZLaTq6$Z6S%8OA!HvLreYMg6fWt4G_izH8c`UWDFqMBFj#P>C9C7K z(v;IXyVez9#*fIp9mL=8iTN1RdA^3Dt7c15ROvBTJytqdZr2vG@2>O9$COBI2Pma| zj^>&c$71G)7SXzk3tv~3`F5KSV3>3)Qxv8Fxb zr26BWH-vOzNrqC?F;g3*Ym9yC5@}H%L&-43d(~Pn|4T6cVwK3natu@@Y?O6b9hL8I zRwm6VB{;UUrC5#CRaUq#UbYpJzcUYvdcBb*!|}6i-k&@_0qmWn`6Nub{0wfUXJt13}>X5Pfak6(X_I~a|~B(nKY)4*PYfI$->9g zTAZrelS)T8klb#p$zhSX_^&p%)qYO*qHLQg$^6VkB~X1t*>n>kyNKLb$DmPPM{l?| zIj?xV-B(QhNt(gm(6RrCQr=C0^ zo{B;lRFFyf$fwTRBe%@RJFFwS>cKZG zlMqGsYm(Q3h(&B{C_8Uw#tFi86%d6Kd5=7ik?9vg8;`VGGA!5HkjD9Pl_@Z4Oq0lY3N$p4zq6%d#KtO2x?jY^%3Q`nONQ9O z(<0SPBY2J!{6l4)a`;>*1~rnAAgdsWCa|F>l7d3XRMkxC?5;Yi>>d4NOUl<oH$&;a3RJ?Q~cX@-y?TR7~w|dmaoevKcuEvRQj_J`Lbuxl7HE8WYhC8RB~3G zF*i|y7-D(6=a3$VFpB>uOoHi26(a{4k}PRWQBkTZtzS7*!coZ7c%khz8dN#in3DI2cD?a221Suu7?If z93a!%9v?cBSI+ZwIVvB!zMzR1KY3&Vsume=oD7tXX~QJi@}`%@v^9$s0*3@i+{Cc7 ziF3n+v;Ovwj9 zn++CaTEz$02tAp#>RTVkQAJlaL5WJLqOV?f4No7$ok8_0kUwDqcDw@6!4x#;s1@^7 zc1WoOPybLCnthY73+PD2GY&z>HxYKjrK2Xvt6eQi@T*2|(IXfU*Ui0rf-D6w>}kN`}Pmlyr2Njj+%-(LsXB5*s6$3!`b!$W648f3zFX znzqt*aLLBd{pF8HIG%^kL!75l zcpOMe4sjw2bFjtelUhp`Fk`yqJlblk80iGLY zucx9Fg^h}NiBD9gkEr03_(3!Sam3Wb5($Pe2p&Z)Mjyk+Ln#djP@+t$xu-@Q*(GF| zhRcnBQRVET;6yMmGKR~1i#772a688|vF!?AKwtz`m;u?@CuR0<5{?GO5%-%6i`r&u zl9b2!B?EO@kvw9P_o+WitE#Eu^|3Vdx|^(OrM?^67@I3*m{yp^Fsj0zdt_<5Wh|j9 zB(g^|0fEXKhGT$(7)SAeL5^O;@9A;++&E~h5!N#5BARmoJ z0pTqV&-RJ{XpsO9T<-3;b1&E3PCI^(*BYf6=rt;~?DV;IHBN_H5Q z)O(dCsRPnrE;X@F_slU+ivY_a*at|yEE1}8Y?E=)$rgrI-P)5?mr%doky{O=WJD$m z6xE{7Bx!x6Bj@wr;BQd)qo(hgzRaI;xBMXwu1+JAr+*=qs_jutRtVL~mEE*e8f>CS zv_+!ECZ(pJs<{{@L{&sBmX=7h2V=LGG6QC)#L(`JZqb3oI{;J%p;B_U-&606s9hK^H*H%&U8q91s5S=<#d;MX1vZgGE*_g zU@0;wB8mkHCN?ktbDU6KM6#AzQbbSJg3Sv-A|<-aMZh3YfTSh+$C|X|2*d=k%n2Zq z0!9NS_lO>jbXQKjc+I$Bl4G3^I1vYy6_)cC8o|8-siB4T0U-FoT0Kc7uShgSUx5mfw$!L)DuUM}yfX`k+2IZG zPVP3h1R{yy%FF~jNEtyfJh_#`KlCDGPFfB~cr1P(ciZnKn)g6{?VFFc>k*X|znxn@%E3nJgr;NWm^~@C?qwBMvw|Fgdsy z^+RVPOzEOCX@&jgyvYB;dv_WZ{}wHkgwJC}d~I^H`!8xpl45^Z>vC-A65~IRYSa zCSLiGSWynraRf1mXDQggfyPK>j8mRxXz0A9s?IEFW80?+R}d2j($G09>)v4K3^co# z5MQam!JfF><@zyzivq#fqhiQ)EmeVw~iDZ7PsWXiHqNwiVY3|8%!a! zx81WV9gL9Zb{&jo{rdaxxi+6CHYSlD3aUgB+e(p&StmSi>?I z9UB?IEH!}`Olv{O(AwjGq0qPC} zfT+zHJw&*I&>SUPN*5V$BX zZ0-(nlo%FxV__uN(-6cBxG5e9G0`R)C79qj#|LtbGpx}>F+-*t5Nsjd(S#&35rC%2 z17ZiULSQzVn35T-tPap%>iG*gFGox}a2z~zG(oOT)Y1kUwbjgpCE#1jOds~#3Esaf#!p(#VYnD*+E8!1VQSXfv2rBrlTQPhwscZnw8_On$;pJkSkkac zbXP`Bla8+Qo0FPSiNuB&8M!bH%^-4^IMEr}DbVILhoPrwj{z&-K|X$_4}>a7F2;k% z`??3SLy;`%LkDAa7En3h){_~k()FPz2pw6=J2q1INa3Lm)3~fdTm?bqcUjz*+A~wcm zbZFUusoV+{Zs2qlAX|ts-OARmH3k_1qdJz9P||=Kat>pzRMb58D;YJkgq+P&l9M_& z=ce`s0{fQkWQ-#oO&D$T1Q;U?*8wRZ!{SPiXY%Roi;b?&|i_nhUZROeQ_b%raPa!i5cSEdU`gBfGBF%-+1Y zge+vD5Cg_?NN`o9tcDEB!Rm7yHj=o)Nb?&oVXn%$vcX-9+)|PlW)oa z&L|zwoe8q)2PU0|R?)8yg^J3VLAn`$J8U*tqWIIj9I)RMvx&5porDMGQfqA+)0p}cedv=gtdR&lcOUs+`tW-WFu|B z8Veht>#RkAr{lYuc)dtHPGz|Hg^GRXrjZQwhkf8 zIjEd9m4X?X`Dfp;cGm9cwY*dA2B>|QCwRv2uB|=6FzCaXOAJcWris9DtAR`K%;--8 zA=`s5omE6kz0}G$QgG%H#H?f{vNssGdDtk1B{T45nTP}-pr)8La#(O|66GzCf6XQQ7Pd}fa$O>E`|xXu*ou-YBujOYY5bl ztQjXs91eqovZOYXf;u_P_ic^FIYW@fn>l|$>9HoSYX^;hoY*<{)O~pEf zFz9X#b#rWNRlKB~g0`gPwB8zs&UJ%PvPDQ1NqS4#g(!(q+Fn5e<)MivBFLWu!cg>5 zXu5OHAVh~jl5p2mk+kMhXw-EMe8WcWq=z9XJJuwIm8%N{f;$OPPU%WeosrAWiu3Qx zhFLyp*6O|N(!4Cg2I6MXQKPPcj|^D@$!H9+LXx87tVP$s@0)tg+QYoNv4*4e)>BvL`j0$NZxs z4{umLFT)?Nm047k8YA9IpO5X>9ifV%jSDE(=qq}MilwltBqb~lBaoXvI_yMV&7)DR zTT0EXqSdt8EY=KrL#T8p!EK5Yd=0%ii zA)#oNat?+8AvywK37&^I7zKfZB1>G^9a{WP&Fp#Y#$2Mc%SS zvH_-6L}Ocx4OXbM%E~Q-v{I858>|>o4eT_sO$!rcHKHp<3(I#0a-H_%2l#9e<{LsU zQbMk>G3(eBMW1?cB1L1wA;@w`99_z4kYrnTeIUi{h44ih6~cI&5fEp)4xnP&J|W)^ zIvyJvNZ%o$z>|k;kok+SOb!(o*muvQhvS^lhgl8gs_-IGMA;3$9q}!seqFY?oa$;> zVIccx!HOpX(+PwF@(D1p>Dw|%1X$shq}gleWrg-w901&8z_5|XA{Na|1$1b%aHgcP zyEz=StZj1pirFAR7ECwZxohjdDCP*w{pD6+>k48*lKVrs>0h*S|8V3@;* z7(|B{?p1}65qgiR0y4v~4DTygGQnsy0 zR`f9VNns%8I+fqt@UwcV9Xkvfl*UaCr5+%hrYLdPrwUUGOhx++8)Fzua41DMP+T3aMsWmQ#U4C!Vip-^Zc!@43*yO?(t9sqk|pRx{a#M}{x2WoSH&2x$H#)W_^ zSEL>5!Gt&3_Ac>JGzM>9o2FB&gHniGkjbPAE|20vjPrz(s=&mdML`ctE{!DoJU9jt z3CIixp$3`slzq)jJz1sb7nI;?1VnPQ#LH$uVVgnCcacUvI|j9aTOAc0)+003*v7L=PHbl zWIa%Neb{n_85b30QD9|CVhz*&ilj9cvXWaHLTIuJVkuHq(oSknk6uV8lwMFyW`@;< zoH8tEAp%)t+EtX)f|)=BcSK(iLqSeCqJf9^o51X_b4S`zJ+atA2ef+@A!Y(6f6Cp} z#kR|8+p-xv1pK z+^lp~DmKewYPI#MZ8xh-Vv{PQI+Zdlk5#KPU8V>^5z_D)gg7JEzSEk3c6r>Bv!sfj zX(WOOgoyPXEyk~T2#O@x9$}0aM42dR7*QyhlYC=`v*W{ux#3Sm3NS+KC^tA?5ZHoR zIg6nr7EzqG#Wis##8hLVTbTx9y1}T@RtsBG3N);>F0f)zraDx0Sp{PcI9wnjD3^&S zga|#bDMmtx(MnUchY+GcgA1t;#VKJfG}A#qM8mO6Lc*ZAl!BxV(XzVcQ4BC?N?M3f z8d+31PEv$|8=8S{bN%4%ASr#{r@{do9V^#Dxov*oF;(mP_dK-bo$8vFMw#){ zG@#kk;p^`sYo4y$dAuM$>x=IA#j0ieV{>A>*kh7FcwiY27Ei{Z8VG4@8XKlf=Q5_NKuIeOwg+ z`N8yS33(+c+3P9QQn^QxPbZdKf4%AviXl)SLM(1|6k%=pbgVd`NI^}6iR67%{CX#X zKU-`y9=?;{dd{Z@+fYAJ!aWM%WJhO@bH$b+)x7VMNe}5N9txfvQe;O4p){SI<7xD8 zrAuO3iE7%hIhs0$`pu)Xp*p~eHDV-?-hQQdS8L32oytn3(+emts}cc33ow4EKF|)y z+jJd@BVK^Dz+&a&2%cji#CRAo%`rFRC917_#_imkq?qQ_Vlucd3s`KlQAN{7+~q8T zrY?y!l|&a7Nn|`RQL*9hcfsc*W8Y3GWkB!{;nj!ep?g7xsLKALe01rKca<=1KAs(g zOXUxdEuMS@Jn$E{t|)L6(&KQv5^+b6!6xb2Mp9E3#1d0cV?zc&jFQOdb~-$^+H;qZ z!r4td95{MC`9n?`h6!iEPD@QCNub2E5{i-J6-h!e6G&P^*xckvvT@zVOT<-e&qkwW z9GQW}cvrdFfgG`bupNVJQT%3xXl~8RP`7h9Q|_?m8JJE~Wk&TfszhOmX(?3#0Prz^5=lx>LZ9a(ln#@n zKfl$WS}BNQW&6%fHEnZO^_p^gig4&~XpPm1(aiQAi+0zQ#aovi38GDv&CKjpwv~CB zG=$uHamh*h$b2K%`57!Y4+pt>oSjYaDDF}O1R#(kSVaQUHs06EZ`oVoMT>n5YU+8G zu{VJem5D79MO3Of>I6?z+KvHJW72&Hp=j!ga-~NF<{L;4&Z87GrA0C-T4{vSL8C`O zv1I8gODv6w))@w@TqZFm+$4q;7lNXMC-jw^(ZN$Z44PndCY8)1qLeL8xvxSqd7Lmk9w4Vp4ur z84IinqFpIn-A0pD+U1oeOC|m1w%w*SD79IPl~#&a$s0A%I#uaC&gkZonK>#)9u%IY zGwOY6uYmGT;NaxG5-SXtTrDs&=44mBTv#2kfy6gH z(L5i#2coz{xPj&D|KLjxx-UippUsGcl{awa_8Wv%17QJPQlbOq6mt<&>k#?^Pmf~ztt^`?x07zJ+UBlY+m+do4a*~} z$st=M@*WBw&btxFR74Fp3C7h$vb`4+Dh%bcZBFK?|5oDixKQjBc7?h^$3x$SBBsJ7j-n=W^c>kBwuTed5v!R@mo=#$* zcnS}~$p6+^u`8hd^ZrkhQ8ilA5lt9P*C0V%q{dKf$6r{y5SYcC9R8gm%ytlG8uclVo^o>Ff$1r+>p%^O!!C{&n zrYlERo&s}vu^*!REZ%%X`77?GmU+x!T_io#AURKZX2pa1_r#Dbh}sDMj7`Jrgn=cV zJ43h}c%WENzO^|(q5bm)Va6!Iuq7<)3tc140g*poK*$5Rz-i(4WA;;-$erw|I+0kh z{TKSm+lwU@C9g27x0I z6YR+F3qAQlP-o!C@h7ccnZV)KCCSXx`s>Q-xO}kTc_z&6t~?Dspfjfqr8;v?NR#fx z0|^=6VU0Lw)SbMp!)n@pcJm~3hE_6~**k7xnX++f#s`whsVd5-ba^NvA}~+)#;i*k zzIyb2yi)v%V3blA8aP+$U~S5rv3Mz|x>0n-Rz@^8u7s9P0I89B8KhY4T$d+KNgKgK z<+!eAK~L=>up*=a7LE`yfUKIL*xD@&mYUeITE^4UJU(R<3Rmb55**bb%_0>M{%AISCU!yY`7}yekFvSr;8X{`q!m3ruXu~55ERp(=h~sV1;jTPP zLaa~PcXJ3w^EFmg{`BvWGlC@qfdUXwkVbH*!^q#RI8v1WQ>MxX6-4hi+6Uu`j6WI% zp>z>I5SGtcaQ1Z51sH!uA>C&fk@Uw3(PdbUQemmaF&r_4^x!s72ND78+Wfs;7{uqh z0u8Tifdm$Lvb!1|T=T=+MD)ttw*{zQaUNxP_&XTV-bwSiO$7I zrkYnGYVNP#mb~1gwMB#oRRoPek|;y|g8UPs#W#c3)=BpL=Q++!4M;|Ch&5$W0}2`x zF<)-Rw3uM3jEu%HSj$Xh)yY>>h1D&Z=#^!b&81}9XuOu`V`M2_%Ib?GEqTTaFw7$l zeQQ|;U1~#2W=f_bAw5DKq?h8JuR~a)$`Ul%X3rzRJgln`hY|1g|2&^jxb}_+I`v?= z?ptcR-4aZ(&{%K7%}W#_EQsbP^wR~Zz%Q8D=+O8cV?#eg^i+CT5J!U`$s|c?Dbwit zeu_IfpWoaZw5Dr3_QhPRUu)4|PmN&R*1+{2$4{7mBx ze3)S940pR=rGz?W!eJ;wicoBQU(HP!2z*?(SJkUrG+Q=;l{GPE@gLQ^7S0hfSbzQ4 zg#ch`y=03&(x#L9Sreb?KT|~NeSs$GX0h=v=j)a&b=|a@vYL}yN?MZCStcgeD9+W@ zo4W0#B}t~TQkxCGL$uoc+0$31*GyE(N$J*8c&@WDrfFexX8aqdYhFfUQktTmZI0^F z?yLuJd6m(5;xIg_SbWnkv05b40MTvXz_RG%W&Av9V&A2G%UP zvcd0Y`4a}yYxR)^lwv@=p5p}bIBA$f5Wfe|yNS}+8seBcPIHo(loA>!JuH+YnrH-M zF&DNr!HEFs5%hTO-BghDl_4XB2?YNz#(30r5k+<_z}icW(P1u%UG#1i3IL1&A|zp+ zj3lE4FwQVPq)9L&4%E_N!J$=n-k;#4+w{?3waaN{!==CW8-pSPME z8Igh^^N3vq>%SfT`9zy%h-g5ilZ-^ssf;iOp-|z zbQN58<|sF-h?uEzVY<}~ERf42$LNWMl&IoFwZGrNW&z zG?FF@nRK0UY~7KD=**G(HZ2y#sovR=9*5e*jVH?^B^yDEsKpr+ zk&IB^=e4ucC29pN8IbylY*f-?5s8INRw}BwNN?0X^7+X*z%i$|GJolmb(5nj1rya8 z-&IfSHI{8Ll+PG}MsnayfkF>qPqjSW*s%0P%2r$pgvlme2_B-K1uCkODfAKXI`Y~i zleLJG;&h3D?<~!VmW)@#DGf-nE2I&8Z|blzrmXa@OCeSv?e-Zt?p7>IQrN{6VwNTg zQT(IJ9?9iCwxi3W%i{nFU6D_Ibbwq%yP*1DrxS7N6|~qLVB&fDieRNuv4@O@LFWYgGXI#Ab3Z8oqs9wB0VGu-fIW zvX;$B?67-Jjzg9+?^eBRJ$F(fmR^2s9rE*3-maMQHW{foZjT{5N38JFJANU=JHLqe z^h!Q)kb?q3eqHsl89ehp^{|n~kMwJ&zG5}Iv}gX{?0SwN(zzcO`Ao*L)#3F%zToX+ zXH_b<_j1z4>mLe?Q%40ddSeZeQ)V%}?sqD?o%F3#q?zU%^+bh%u-G6o0U?8|8vMuj z(4`qOuCT6UGn#+XI$UTPk&s{`0(1+~Iv~Y`WEdPd2XVUujZEYO2Q8ukY$!5RS3@ylHf!9ndHUDFD*F{TZ zTYY{0O`PQPRHa17W>|pVpC=*bT?}w+afs*(A)Gnytb@JOK^)2K$E|ComrJ^NmUv$4 zHg|YtT)CN<$_&eD+xYGMe{&JZ&mGQ)C%CGBcL1nBSHFjPpb!2r6%+Zyf<S7Sk+`svTq=M)o|FUnbiHF$%NtM*|yJIt|GD-OIF^B;AlpP5Y)rjfruBa9JWSFj#fG z>=Vp$hvWP1&z0SkG6m<%+&p4|wD4iDoq2w_O^>OJKOQERqibY6X-2cAh6;*V6J%I2 zqLxH?61Q(I+i4A1MKQGAx8lC-ll1=9Z~LhXBZ@m?H~J-o8KsMDkh7u|04xp+;b|vy zRBRI19D-?0rIM1`N?C0wX3EkES&{#S^CLpim*9F%Zv}ooA6KXS=kT4wa13{006U;5 zG5nY_Jw;@0{hQ~M-?$fYZH(7uv9K-C66lf2)>(moq3VneW3A-8BStL-OHQLf(9-3i zk-Z|042I4cOBPs>AIiAH%eZ)P$Fc}@Q0WA|)5IXT54~XwL7i9n3!vavw!`CeGB~JK z!nG$=U-@I>Pj3W7j}@(GMGk#T3`$b!bA443b$HI&E_VKYAl30WNF zExThbI4(y52pr+VV1U_9G$FALVu)-Iq-sruM@0=GQiZ^bNh6Eg!*(gS3^N!wByqUN zY0}>^R%z2&yc`#@ks^F^rwisi<6{|Q#p_t)n<+SQVYKBG(~eGDSUF=m5ayx?C^9~A znQLlP%COBZO)Oz0BRZWvCk@DYzLeGnA8>wBh9nGf;ev9>VtE*YkwTQRd-QNA=ff-w zWiXjHvq}vDiYr=H+^UlDq4 zQ2L$W@Q2^f-+<1eD0k7nOlMxVL2a^j>4~jvsVzu%bO&LP-=>$;jgKRPm2Od@DVnHp zN}L)_DY26qSuGh?3ywC~?&{pNAp^kxYBYo_L+-s{sFqatY+Fs4W@aCggOaBs5XOhU zj;O5QI%Onq?C=^7141@T{+3zWJbd#i8yr| zlVsd)ra2oXo}*-&$;y$^G`qjINrS;UF-s3QvDZmjb6r1^cHIL3rg{muf@C1NOW~>mMPw2YRU$$`Mhq52Fe3^w0AAG>mgOF(hF}rj68BI=ZYJ?? zP+UnR31Y=lpSYO!A|Gv$E1SIH$5zmO^Kp&vAI-G(|MVA7hJ=3j*$Y$b1Yg-<1|^V5 z^nI1?`k2LCSrw*j9-_NDkBW4Ozs7zs_$=unEnL7!l?e=OpxR}vi&{$3R>f*9x9&;{ zN^L1@W{R;I#cdUfN@7fzDxzALMTs<&rMBATYAvF*lNz*}YBtx@Ol+Zy(ppHMqSRX( zLSrVIGQv%y+FF!m(rGQq)T(VYzr}6V(<0QRHNUXYtz4@9%(Zm3npm$u0t03!M#Igu(=^-$F#S&BslwzQ;UNxkDZPvfB+`W6U@~&wp+Om7AQ)`xDrc^D0&@d_- zzTMg*2#A)rfl!PHkx(iE2mMT9-xy{X79FLaaKsOJr)2jJ_>2Z8?^>3 zgwz-efKGcfh84^RsGLfyi0SPr>Y9cs@A7cnm)uJGD?syOQ)CGdApl5kq;fZDRdSh2 zY&*#uV+Zd3z@`KLxub7OKgC@{6A|5f7|O-V4%H# z{_#MhMg0F*{``@vw}k;o;fW$ zYRX!|GY|WpFSF|rF2m@yomEPRkN@)&6_RB&m!4EyPy<5e_y_<0|KI=r|NsC0|NsC0 z|MoY_?5u>bJtzS}g%SZb+d+jnk#u?@PCPr8F;0r?;+qhpsjX9k#jcx1R7ibvaAc^zNuV1s{Fl`_HbJA=&7w za?#zV_fB-r= z3J!p7U;qJ1Du4h1&;SA6Z$JW`fP2A@Km*VK^iTt;ga7~(00001KrNk&0U>q))~Ki= zMF0X$f{g$>y~mIMchr6M<=zhK9+;~K(0T8$)o$;dWfFiC_N9hWi|A^A9<(c zIsgCw52vnx1HFOt0001e9zb#c4@xOQfB*mh8XrIdn-=3-00000003*C0000z00YyT zPyhe`0Mpd~9EGs=ZL9zQ0000QJ75FTJbL7S00&(k0000AXbb=h?|sUWo40pvw)R}) zm(2mt00000X}tRScmNNsYJ0x<)7L_$*7tW#-nt+G@$gS@Z+(w%bN~mBvugkiXf*V0 zzU9U%M?e4#*Kh;S5=eRyP<`|19!#pXZevy63p(FIDJp`hs!~W%N~#r5fC^Gc6ci`` zP^u^e02Ba36rdEMLV#5jKm{s_q4#_ba9{-o-&IX(03Lv1`h8vT=R0oA*`wauEv~n+ z+t&E)&$kDi_u1jq3KRex4zB0ZIlXOa&G*-H*W4ca#|D5B0D64}^PabC^S9hLuedL6 zy*_=k6nDDUHs1SRKH&GSzWR5-GIlg6-|jWYXG;d3Cn; z%f5+KUn6|-hHl;M)IFO_l=Wksq&)lG-+jPcwd}@wwCPD#xZOuiedCV%eZJp3`Z>*S zd(mh&tUBGaqn_|_7k1X{(U4DBGW)vQdOVzMwEN?G(mst^?_0jK3C~B;eebz@oZ1&A zr@`geldNtpyCC`*2KlRmIn}<#_bCX7`v+76o`#EicJAh*VHE5d3ZWKmeTI46(|hd? ze7^g$o3~wMqg|hQ=3Vyk?YGw^?(Dhmu&(%h-PX3T)|ux#J=g+v0qL3T&v2#hW!cki zt;c1yle^D(><5w67Tw+2*0rZSpFYxicQSasz{9zTsB;Zt>Ht(J(qG(-u>%cB|`pzF^7m6}uZ&X=Q=ktnv?N3V zfDIY|dR>Q?#@{@{R?a~Cy_(!O9F_He`@Z^s8Z-qc9{CkMLcw{ozPBLnp7~y1bIyPZ zeQn*x+hF^%c=P~Q4foyE-d^H+FTK4Z(@+}&sdv}0L%SzRyJ*yHO;#%2KpveQZ+7jJ z)9c*4mvv2hoH}0amkdH(JFQzP(&e3O>0Qu;rrQZ6H=h6iJI`#=X@g9Z)o6{XV12r| z5`}kk_q|c;-D|0v?eP@(dfeN$!L4@NJ#O^f_O}mSnk~<^cg^VazI^-L_j{%A`1^Zy z^JWsZy6?T+s?DkyR%-(vPo*{eJB9>C<7q-eHOiO##Gh|$GqO`+9!iYs;YhWpC4>b zx@x|?=Jvy0_%XtpH1?XBZLep2jcdDou=IT^qr1ATOpZMdEOc}b-okn z@$2WNiRaw_AAL0Xy_*3bJ$=|pXn_DgMt}$a1ON~WiG7shTE@>W@t|9#9n$A_5Q-NrYqx zk)sh9nFB&JDdL+oHi~&qNc0HE(UE}|`H#>39Q``TJ5WFADzE%VB0nzUi$FjzC=>)p z(DXd8@a8}?w8RjwQ8mtcx*cJXLWqchNeQTegdzr*KPh1q3`i11b0%V7h?uCLl9V8n zk*G>29u}1*sfd|Libx=$8A3uBngSvsCRw1SqBH}BnreZHh$;w3h5@3MA|N1wV3LYu zAR=aDIL2H;p^<4wkQte0sb4JHKfYR66ZBRLZ~9sOyLkq5GG8HMb1KrMYL5DWSET5DR1znD2~o} z)|S(pMHZJ+6`fKjWxyXhxK=7DajI6Q`@zN9`mxS?IxHlNC5U7YbCg6C86`n>a5XFy zY6O9^ol6cu#jS#fTMboVCfG+1B!&F%c=Rq@oHAQc1$yJb9tN34BBF_k0%6S)qJ?WT zB}$5oSdb)C8m4DRcUaitrL-Rq*Yh(`s2!;L+R)IBtU|A z%Goc!Zs~3-j_!CG=0)q6RsEl%{{Q=5kFQ@phsO%+UqbKDICkzaRbbPKW^Cv|#Y?gw zWRX=?C{hO|Ls^IvP@x=xuBv8elvNZ&RT8L!5K7L+opQOhY!tFnsjOm6F;P^&qPYcB zRb`e{8YL1WL8XgRWvFCxtj$u|{Ba#<%qWp$0dS#F{V!}HDTvgl%9 zAu{3A1&axnWJ(7#{?FM}2T+*^SW=N05)=sZJ>2mqySt;iv$L*)gg|m!+U;x(R4y#3 zK{gyHh>9Wzj#N=xiYlPdlvxI%l|;z8tqu|`I99Zf^qs<-IJ>&*bxbZrsIqc!i440a z;mZygiLM@8v}jRL=AwAvz`b=5IOd}^ZS4R&#b=^x_s;=(jdf^ey4vdC5F-t^2Q52Z-q=QE+Fu&J6 z+x)~@e~NtoWc$geyG8qdagXYSrtv*gV;y-t+zAM~uaHUhB zLa*6zGg8<8-Az1GHX%%{G! zD08U{y5MvV6d)n{qqRD9Pv(Bx?1-M{xkP1$b<5PNS5mJXvM9G$VS|KfIJY>GMWumJ z({-+hm_>5aS;%4G&bfF}E@9wkMI}|YIPUH?c?Er{EJGmZ&rQ5>S9j?ESJ z_m1=(HFE0;CSDOEQ8_F)8*WY$iRkQZNio%K?mj*f-tIU>MHLYhLCdhOIZ$q0H5VMY z9vN`Futc)jA-jpXPRDmRUDOlKIWsvsjy6FsnPa$eNh8z5Wy(rOSXY?pCGOVfXlIVy z+?;T5b6wrg?%|{z-HW(M>g9WaP=*I2=&doHe4G}aaB`uOUl0oMXTSCYv6Oh~}E*|Z+ znSe+|1CGG*;T2RzDp)B+$~i_gqCrwQ9_OHe-MIj)a%5qrFK_Ah-?V)G!V&fKkC7EX z?meD7eZ9(P4Lg=;f*M?$+@0Lq2OV-J2O-HYd@GCear2}-Mb>Oa<*w+C-NFc~!^|gj zWe#vJb;-#HY2uA1oOHw6yC`VpFs%egq4k9acNnw*rJ{$t#FG%5D6xe$_`VQ~9Gjh# zE(vM2qSem_QO?>_@6F%Rhtcs;#>c?~IQr&@yLVtm3%LV=i48fFxeAWx=xLUXA;)(aN{YGMb*dpblH%Domr32- zq|FB7Jeb`U6J!9oA}V4HUoap2XVNnsZ4^U6e=Gf`*|1xk>D1@lv7M|(Q}9$JLS|rd z8p%NzUDesi-wLy=d!3K@o$&7-MC<-`b2d%wWxls5ul|=e_v1a>#7UxpR5aEzhpJJ^ zqN~{4;NvFjs2|$n^Q;v&Z->8u5A=BQ@-i>lClGfWNYJlB={sDFeERrrWmWgfkC_fh zKvIT{UESFfow#ZgjCRJ0mr5j+KOp$>52H#{HhF{|R>~B%{s*~LOLliS-H^$9i=tcW zymh4U*D2lJq)w?&Ui2Tqi@th3K?#{VI44gJ1Tig{?*F))*kd*xoQ}rG%qX~VC;+`|NB3fbRi^?88AU# z^8Xg#u!S^J5Lz@v1QHV{cM~Q_Bq1P?GPR6^DMz|54V3?EpUvw3*UCD@NdMf}Z3)fU z!GG2N^{I8vJiqo-rQ}$&k9BPd!h6akUp zlm_UwXg%u|x+g1Bl>p$TRE5i)2$e)sP6~pN6j7CZ)+2Xr)eQLd+a3#BNA-WF5yR{8 zleo?we(mGt@bhv!(i!0N!`3=X@UIeKGD3&5hAdX_0k6wsT>hvyzUZZ$;eduCQPTWhINbx6Dv1h` zoe2^yGBpn{bQ4Q-VNGIGx!eu~PDv1)j_sn7bJpyu)&aO)-38Iu$6(a3=gI^pL| z>fPL1SfM%zBvZIbYB)yZZitoauUB1Z@vh*ZvLJDz$A-&0$2~iu+2!DbBqtUflr7!J z%~8V#BWF@^#5}>2@CeD|!P?fy@EetWp*?Dt~wR_@}Z>LiF$eKJ0~ z#7+-n?-K6p_XT%zozr(6=r=x0oOufA3Bo&%5v?yLoL7Kjt_8r3!(x)=X`u>tdUB#@ zf|7`&7^s-4s;Y>Hf{4yK%d58JFIR-qj!QTk;z={IIrVqVq@A8QK6iXXTBD8OcHxL9 zrDl7xj+EsSR2znQthm|4CV62;v5Iu)?V*|N#Hr6`1ov@v?om`DpzWiCWJF!bHzaX5 zR8Zr=z?F@_q5z7ScHXJScPhH7+iHZy`5!$85p0?qLWDSkLVd-^LObMoh~}`sxN>ujeGvK46BQ^rC$|dbZP@KeLQ~l6oQJ23x~Vw_e9d(! zp42fF6BXQInIVAf43h;6lQBChnPQl`j6hdsymC&#pdguv1ZEW>)09O>N#OxO&L#?2 zAefpe3Mwk0=M7Bp%AlZfiI-#1+lo^|BZtvUJT=|iMHI@`Lck@sN0!0bv1b4{$d0pI zK|4D=pFIBzIA-kliXriBUz#e3yAO*Gs2^5gAWj0;i$UMS=ltC~i zP!uOFkWi~sV~RB5;vq32;D@LV+ntwTKrXsSv?OkVP7!+cV}m4 z`UC#d+9BU`G5@;j|DP4p*Y!?aKlWkEp|pHj8TKYW>%{t^b^o}jyKM>5Ty8({l{UNI zc#DZhPMk4J#(TH-qL*wnvt+Tw?TyiDxdf2oP4Y#MDXyw>;iESNo@zQVb`I`qGn_g&xR8JRTojXdZ=@1(eGd{Iv>q|v1c?)e z&#HLNY?EVGgqTR)?SyqtJHMGzQjyafCH&va^rLqU5Ts2s_V+Jo#E)fVF9#ez%I8vh zkPexl0;Bcl_tiiBN$Pecz6UoWWF9whVNHg%&ghpvKW{^Ng(ccA{yO6M7u_Z6zAbBr zTSYz3ep6B7g@|i;eSLmp%dPjONz)xHyb&N)e)uuk?d?Ui>T=TU!W(l`Y zyEw~AeHUyzA=Ei>H{fBP9iAT(A*O0G_u(Rs>siEv|8hUemmv6ZH74=7PYBFmg5Rh(nerJJmyQB#defdZWU6d6? zSqKr=FgNR;R>md1bCcg2O@BP$5$VelUi%3m)CO>{s!yK|{Vqp5&Xz?R;g8?hjdxp} z8W%+WYcD_PUb&X)-|cjJW;)L&*XaqD7?De$^^R9VQn}G?}HmT^6OJOhM4BmBgOvsk&gg zSo{5)5-mFKr&_IqOD@^F*Aq`DC_-nYXE8Zdm+w7$rK z74P?N+qaCToLbKGbiKPa>r1Pa?wR4$l`x&(3-)>6*&C1qT|QoYHabH4zlL}H7=Kp` z^~fZCpqgr`gZClCgpxv!|JG&;?F@f%W*s(JntY`3$JcbbC$jFD(@7W09h>i)r{L@` z6)Gw}C+3RhASn-WAvA~06jGYY<|o#LSM<4W%TL|=Z}r7Lk?`Q&7eB+`o5eHwsojs? zDK)(cWpwa{j34Sgq{vAs7%!n`ei0`f2~IX^!y{9vZr{rmwWG&v;5Xk5qc3*Lq?5LB zK2Ny{{hZv|gUypjc(5Vi0#Oh%G&CSlNR*WkO(0MMLtDgER{t=3t+BT&?bdUb`PnCM zRS|@11EjqugrV7d-@U-|$$`={Ly3@49;Dj+yZ}2;d>7t^W^Pqx+s06D{2h$^*z*1P zl?TxtG8!gepePC*SKf9>q; z5>u(Nr!QBIy7pEbL?kxh1J{1eA-5H9$-zJQl&Z!|3UWA@VUwmP?K8hek!4o`)InBZIDs5b%YFk{!wX;gGVL>7u5zdEX zgpQ|(aMRf5?~|d?tw*HK1fl$_RY~ymIz;{(6*edhsAafg@s36*R!lJ_RGO)$RH|Gy z)CprI)gI8qC_;pRB)SmHOvF-@yct@km_($wjiFI1i)z-;ZAl=F@)#u!k{Fe|swR{% zx+wD?f}*_t2F^bIk@wa1=~ui*76=j{A|WHs`{KSs8X@%+)2O1Ze2?G^$YH1eMBRjV zo4Grt;Elge8G0+x_+e^P^hXb-cYkE?r2LEUQ-{A9RL>^u=gPY;YxZHa)?O~8J0W~g z>a+3DxwIS`vAepEcCP6MbkwDsniF(P#v;y54uItQJ=Z7E`8x?fqExE>S_|Xx?Gckm zNK`))(rK!e6NJc()G<08vTos8WddcoR56r+z?})U11jVt3e;Mj&Q(V)OjZ3<;Sm}d zLP;<|N-W!?qPH$t{VI`FicnP*G$5ArQ0m+}8Wj?{R*9=t;zWe08xdouCQ`*GB+Kl! z4(KIlFP(Pvw~n@QC_?|id-+poHHa09leHHX+G#hzumYwb0GToDwS4!D^z$Hlc{yfxq#{)SmXaX!ng( zHMA4hKHutm`s;i5&J7@l4bkVwq3$ieNSh=1NAq^)kAVguY4$fM9yyl;Atb!(RVpT` zVuVH}mV_#U*2M@?(DF?QLGv5*b|^$5nOGxAZ@v|YCXlg2lfIoA6w8Lh$X6alzLR!B zYVI;_N?i%ACP?V%q9wK69k+7zu5Ty1&*Di52*pyuVdv#GZ}Lu=>@$&jDU+MOt_TgXs zPw?{n@^$wj%&=RdS;&V}SW!e;nHIU)^MfGn&9#xJ)tO};7xmiP>(S?GX_5WM-*YJQ z&)z3)AHPR@AFSP`E2Ap zp;{O2a|u)U;zCjRW0n7PX(exulUZr$Av9&w+8XKv2Cdw7;#6-LDpTt=l$6mezyzWa zfhdnr7>I*T;GUKtR;D89w9`n|ztu$`MZ&PaIL1t0isc6L5kci9LCUj+grW&UR@X$O z1@-v4Ms(&DF{KG9RVrp!$te>eP$F3=w5$S<5D+jS3usl0+uLQ7e0TH^<^0LKAehN&9i!SyrVGLHrZ~sJTZ9DhfP@ z&XZWQ($X%IT=#8#G1rfvmE;HBITXI{C3|UPo=24rJ@bHY?m0Y=`8`J~7u!9&v;jF* zWX5-Q9$bshXFUh54a3POrS}e^N`1zFDWRpH3Th%DDuO!@lRWJGi+AsUk-|T0$CLUV zPGkushK~cd=txN>OEF8E4nK~xqu&=M#SXBFDkwb{CDd=aNtF>Av2!l0WYzd&?)#;!()i6DjhPJ@?{ z`F3;>qgo>Ol)l-Ebf&EH{Su0>I&QhjU5gbAs3g-7tHa8plYUfi?4Yt~0PZDTY?~#Z zI$-h$0$vkzxAaAZxg{7mM{-JR_q>9Bd_8>NT<(^2@j2=5c{sf1y8Ag38bl!^F%xRZ zq%?#H0pzN?ueT-peb05Ws>>Ww5(;zSTZ{e7t9od5c1q;p?;X~_^R3KW&9exDpisB* zb_Wo|jS)2nUdtQ(p16RUFzLVeO>%7Sau#mmLSp{!Y_;~pWcAfCf@U)L)If5UtQ4kq z`{nP8ye`65koe;|%I)w6iWJiE;Wby=No6GEq2+nw+<%s$)U+0 zv^zp(s)rrCTg}dU{vOV+g9q92wZnt4b#43ZuS(#ZDY^2W{~mc15_{bHu5yZ6w}StZ zd97MPTUA|85fhfK>*SdiA1?Xe&m%;^5~ZS(Y9=W3UP(dYFPb^-XVc*A7U4&-CDY}{ z1#`Gj@wJ`hI22(1xJ<%K-4$j4p(tMzI&Z2@T!}*cGKn?_FGQ0`9g%3~iosM|DOu~r z=Ni}Bt-HD7^=55$h=OUW6-c@ui&{;MpBq#g-=~X)s+psRNxhB0{$0l-t^Ln(obRr_ z9_zWBk0o~eM4gpyv-7UE2PrX3e8) zH5#7>eQePu%j>ivn;Q=zsu_}NWYAKSG*Gk@ooIx2x#GT`w*&k;DPe{{i_bry`;(xB z&!xqVvb|=H>jCWxn_iMMz?s0YNsW{ zp{qc35sqFDw{HEzUpBK}gp@%JL^-Z=1Sv=+nG#K?+KX+oM{eV}-9&PEp(c%SV5NAF zj~;U3T=QJ)Z^r@VeP9YFRLvLO_tQrZlSjnh|bd)t3~N z6S*o8EO5A;iHOAxZfc+41gc<=wk5?4B!m@~bN%A%j5|fk)YD|f#STD}N_G_5e28i)jdNK}5g434q1e@r5K@~hwlZI!Cl=Ofko0g)2(tJbKmvz^UdmZK5u;Tsw2-~9A0O6 zJcET%d|S40L%id=>Ep=`SyestcV2or?&4E5YLQ6@V=cetc&tKVDH5eZO;qmaJnkqs zm%Y8mo_pR8s0)@#U)?9B@w`HN;XI>Libwp)REQds4o~O2PRGcSQ?MmOVjMILL5VyS zs_SIRgp#J1u_j6fOHx$ZDMLX>%??slA)*}|I2uYOO-X60l(8wu<1L0VE_F#?#+8!J<QsJ7(`6Zn`rd~ zCU1ZE`yVdm{hT|vc)aLuLZ@jIOereFC_s_2PQ*#xU)?xLMc>~z38vxtDGgbqp3-(= z4}-#Qc5ex;MGwCT%0-^Y0)E2{l(m=2Q_35k~C9j=_lj(Nj0MBqLu`eOrDu>(&B zV#uWF4gQI~^u^VCCM=odtPKiAYbbxE*sOo70PCGO#qdFTYtUgwNN?LWT}xab{3Y_c zK74f?C$djvw`Ycq4&5}G>x1-0o%-w9JS>f^?_I*w8(nOTw#KMw626mzx2q)#cIM^F z!3SP4<0nj$GCowEhYZ zpcXUowJf>)(Q%5S=_7{Kf2Q6sioc~Aq0otiqH2O!GBTyg5Y%qOtNRKDBwEEQ{b{5l zm{~C2C>-+WKjfWQdkAG6`5P=(u`DAWIt%gawfL5lUhtX=ns^(d@pFxpv%` zrXxXj-#H$G^v|n{yCx3-&h_VO%Vvzv1o*s-SHe?D9p9a4{!%=W+l;KGJ(1%k=lAo# zlIK@eO3Ypl%^yR=l%gHbo!y5)7w^f-n*;fC54bxYgdy2Vcr{)T9Lb!-ILLxSV%wrd zHi$wewUR2acOnm{nivB>(ytW!x1?gVN&i!bB|+sL+P3O(tE;(jcw(zWYGCYyO{9c` zOGOVoszMc9T@u7I9I91liHkv2*=@_cA3sT^x6jh5(i3K>jTN+pHqG>lve&CSQ3DU> z7lM|^YxX$Vhx~7@49sGO4W!JTl9#iHx$-1CV(zSoFL2##nmgNTdE!k&X?4xFN6J2y zY6VRE$qupF{mdF6Dp3s8wUD53_+*pNmH**3qLTNj3Azyq%K9_7s6uz)5JF>?j+UUJ zij!ikn9e=D-+aRWP|_qsKvVwOib{W;T|p64w47>OL`gtt3=pJ5Na&=+O#!By)Xp5SmFGY`>HNs*=6NR{J5|U!P+XvS&Kc<8GtB>%<`Tv} zW8xY#FV0UwyAl`Zi$O_22tzjLXb}n6{CQoBr~(C=Ve-B&!SgMp?L^C|8?G-6Jhh$H z2mE%!U315#+WuJQYD}gz3l9o<@#d{HYX69GtC}^nccSbR`x`edw*?h$&w58))C`I8D2%PP{#x8ODnI&Em!kDS~M%DvvR4p10j>3%dvA z#o5pEjGJbUOBeu@ybV;|TkgZpy9(Psw%+}o?5oj%uE!-*XA#80lBfBwdKdzJmDAnN z7fG;05$u4yGeU1FG~>^to5db=WYNLIjQ3A8KPj~^?W}^UJlwe&eAR+`T->&05rrp| zj&&vWZ9 zT&#<(m#dEqsg<(BDc|B512RnCoVTfo+T>X}R}$*}68#Jd?q&2JN7fXa*XiV3*3sFE zAZV1U`^1^7hPgZnu0nZAAAVeZWFaJqSyE7{@H`?VC@G?92?zs(s0csjA;=CaKG_h=^ZGKj-=pu zRT0Xggkr0X8CtT($JTh%Vy~9f5|q)sl&JQ`qM-d^33i@4MN-;Ml+(s<)>rVy5|F5! zDsKEPCS_`oB>X>=d1cdtp(`cV*BDNDxpv3H)-=CCn$xWAXIV32V*ium?;rC^|Bka|q!eJgZHS#>BsqDc9_Y>f#H{XVPYO|`}NV(oB&DL(!WE!|I)yz3pV zO5ULG6ig%tKzRyDiWrocs34F<6aOdy!UR$RhEPSxMMKpHf%(fu(UDAvv#-r> z=Q59BISGgdLTCgc1f-<~fD(lepaf_XJYe*Y^MHKsIND7}hSe*aFp0?TaxE%yUp6^@ zKZc-r3qeN};JglhlW^MS-++%L6latV_~8#$y_r&mOrIJN`rY?7e6Ahb zdGe)@-)ibi7&yP$v-rsCR9fHBd_%M+cVW6^WfPSh@zjpArQW+>gq?s*|HtiDL@rDM{JrxklPa@_Q0XPI)|JA z{=!}`f2@L#idq(jvy7Gp{r)kkYuBCcOxCgWzHW}@&+sg-iH?%EdF9)V59_&NxxDKt ztIQJ-N}8#J(Ur*d`v;ElWBk8n_7FW9KQ8V)9K2glfVQX%hsFbwOULAlaR}0z7_jB^ z)-=QoG3JK5-2iZ!0+QSg#a;scKL2POcQhNO6h*5`1@~N|ZPy=?f&OGQ(T+?V*n5xb zJ9}=VPd`zPl(5QB!ga$ynE_30;dQ&V+~2=_-ofDs#N?rYYD-~skedY|Xuui)ss@rJ zF$0MKO_9=Xt61;q|8KbuUq=}_2(<1p8k~kxi}W0hAFrE+gA+hehZv6&a-oP~Tv0qy zSiTdM9yDlU44af1f@!Q5>OZf~fBQenf$|lX=>H0AlQhsI2^;c*?U9=j;q@ia6+?d? z<_-{9As|e@!r+*F4^+?vTB$TDkpuy|$8jk|1Jz$LZlpLMWH@<;2%*^<`ceb!F0-0!9vJ@u-|OM$vzdZz9Y}*}k|QZC zg4q!1OxK*_aT6h#m~g;iucp9BfyZyqeV>=4KWAe8#5eWt^-W*)->;%XMc%o(FRynM zuNT+8d?KP}7x7J9T0j1(%~7Q_KjBYrnZ0u*OH%8c-nQ#|zHVPNmia3<8@tffS-`?( zG}kC}uDI@VF5IpqsLaM^HGH;hD=PW2-OA+dOVLH;d!6qj#cp|p6?Zn? zo0pZt49i+>^`dipyUptbx1r{1nOjRIT2)x9l<$?HNme~n?q*c&W8ss%)ZZ@#Un%CW z-0xiG-e)T6@!dDg^K+t!w^aF$cTF6+=BZ})cay$t%)Rnc+nv?9yOj7l$*a7(Nk=X>RgOn_8Dq$tRoPRnBW9dRe^JGI;q?kd5UrnDD}9oO{bvo31RKbDEdVS#>iveCE{ZU0N@Dizc``-0ux*T*X_~ z_@_+f^OKyZ-R0{yn6-7z8#kmUGw&Z=7Glb@~$*m1% z6*=B3t&U0EdHM-{| zTB5@Vfe7$SVu|sA9?fn0I_0^_XYQMjE3kA!@eZ`c5gd1 z2~2M&=aCF&CLNUQYG3eSm2Hdj&S+pG?)kUSZC7c-Ks)>oqp8lhwHN6p5Hel%@2lLq zqWh=d_VBvXl@(p?cat1h)%dR4wm@@tb5vXLrxcB@$Vz1Hz8(^a*bx6SjM zyshaMzH3iKQxxMRp-VafCI^(O=y}Hz@o3j9c zKz_eC$v3G|xmv+ix6V3sDt50|FPhEf=-zQw?)XUpclZ;y3m zq|9rYyVBy+sXy?c(r?+waS)lR;-$;i`MzQ z@ZTy{^z5qUt~7D;Mq0LVf0y|;zW9kXt@5tlOIN*jH@BISy`0>+-d^>bvr{|4aFkPf z(wgTT&l49gdbO-sS*=zr=E=FKm3nv0Z+z1hQK`;V*5_8V^><39`FtJ<`6ZTaTq8FnR}XCccV#@6t%gIYgD-HW;-oCUN)vpZ#JiS&5~(l z6t$Op)}C_wk6VHqK%hXOB%}4yzO~UiUB0OAo14s<^IPTW<}vRzZB+7gX=aJNDy`v9 zeB7x}s;%yFb9U}{@!H+$*0VNcUKqk&p3J$?j<1`oVrH?dxqQ}Bd(oTH+Ma7$E1QyJ z(Qf7(+w-(vSh~)Y4!Z7hD=@M5d97ygJ$B2>s?n+{=T*L6IhvJqTr*RnQ+dSpx4rO7 z9$yp9X}3X-T)Nijt@BP^s?BSew|T|KzH-r-x2|crzExi*NS!Sj&Q5LfOIpoqd*>qb z?~}xCvn{>KeAc#!$)&q*Ql8Y+UF!|qO=)O$p7)`gdCb)#o3@QC9x`}pRo%4+y8H$O ztB<)0m{(g1`K!(%@6wuiR_ECwFE!Yna->&U+HbOIE+(GkIu~9sia9ZtV01}-|GYoQ z&*k|!{X}F$*TWF`ZE6py*ZML3B$rZj|uDbi_xfn>K ziB9yl{|X%j4ivB8h{V47e`3dFtZAGUlPdpXsW<(Yx}8*3|DMy}tktT%UlpXczZfdr zThw5!G+;^P-lRgs*X1lQUtxV_SqZunjQ_Lr9ZmI2@A-aRMaS(X?Cv{Yf7$stS6MJe zZDuDeU}~me3o$U0bJ}iaVRZYu$&x=w=^>>k>ga;x7_t!g(3TM6Wl!!KLIhd<^+s_= zNF#_pY<{FX@b6U{^C90Xj=W??XZyY}NO}k?I|I1tS0%GXgTLzPdMlvl(j);f9EoLM zzRhOr@wt)-7tZZ=UY1N+^2gqD9-rIM&b)k!`&al#x+Hi)h4CG)H<0%ld>>?5T%H}^D_Dfd(r{k4*kk{qAB-D{nH1}B=LT1fJpRT5) znEtj-2Ehm4r1+7`;0wwAzhU@Z+nf46<^UI#_LxUrFGgY+$9Mh8`8wXn^bz6DDn!4* zZ!e=T6%S=fG?sUe!)L)xA8k&JktW8R)}>$G{`mh?%?X*Po24^+P~B;XrNs^hYQtbX zqbf*aiK(nG=^&Ti5z>+w$~x$zNi=yDe=J4+Yo|YFn8K@XPu%ME%t|VXsUU$WGI3&< z19j~`Hpe4wpO0Ge@9)*aL&&i_<+iHPtnZyIY*q{l@*H4h>^+9lHpaLswwb8XvOWjI z)WH@jU85l$LFNS67iz{ROMbCGyZpGH!UUub4{3;Tll*}O)J+70$7W(;Z`fY_fPk_q zn2o9B$v%!G6ZGtf3{Iw!pYUJq<8SZGhW~dRFYYtX9e(XG4~Lb$ZU9}(b#GdE{){!h zo-?S8F~~O|n&Zk1`ER1$Y~Aajo@MJcGxGhjA-L8H|GyKf4jScPQry5r{IuPK)?@wo z81bV0c#v=RkTJ=Y#`BKF2zE&M&TU}+sPnn%A%;1S8d!EJG_m_GQaXP2^%Yjg=Eo{< znV888#Nvb*37dB#%O7LoyB@TOu2AXJTOw|vRVG9l- zP|QJq%!h1I+1FsTGvAlC;U-|vK#CxC4i9rmOngv1{#~-Pv|IWAmf&Wr(-hy;N)0iQ znY53NPIU-DHo<3R82RWFgJdy9IB;%Z%R=D3Pie9zoRK|bJI_&z-+7Xr!-2h8JLQvc z4TKV1NCuJ^LRz~M{f5o=U6rgd+BU)&sE@NJ7&%npK*zBIUYV~her=K=fXOkvg!h(! z0ae-wGGNov*6;J+T8W)8!G^)xR1YUZyA+_{_?e~>)1KX69`4iwq0gSTv+>k<*l_%e zGNGs0KHW}w+iwgq#A=vlOl3J0bGb6ZeA$ijEETiYS7NEHR)%9#=R!C<1|7WDHc%n?h-zpolG%bQ%>L5+Vzk z5CVZf7L-a_Kq(as0H%;Z)1?zhr3+*~pWo__4`O;o4wZ z8<9g`ktZC}1kqDQinN_HT)IzJFLxTauX{hT_q|+`6vp_Q^Wq;^ubtes+@HjrJ$)qO ziDI9eXqPB-GJc3dhPpdRAq=xjT5$2XVefc31j*}o;tw=hN7gEz`>oJ7aK@&b$dw*p zA!up}Er<1#$R$9(5v+Vp_x+C(@+aoNkLfHp z{}0Re|DGqo7uw!CCLv7RkM%t=jtA-Ljh-Do4dK<9&X9?6${|Y#{Gw~KXk`s-#|v?> z#fl%sgtI3(CQl*S5J-2w(I4!q%AW~W_SzLPtvR)qvkr}|>DKrWH*nnkGA%MlTc6DM zeHvQ58;)paSfc{3*Z6AL{+gdXGUau1=+rscHIga`amFDz05qx>Idlo)T%ct4Du9zHwsg z;`1~{E@GW5-ioSrc`AwPM}&_*d*H%Y^i$xsqpf#LowNIP%(^lDxIub}o+?@@S zL_4$XTV}dr1}VFhE%v(Bdc=G;t*kg`hRy2E^adCbe(}x;@-}Sp zKPLapbHkXsAd}8UhM1aYB4!ne3JFp>7o6$8FWPU!`Apz&C;5>Jr)OOqn-PQuH@P%= zx_<=uUrbXE6r9D*U+DMsH&5y3)I9okgjm|Dpn|qB^nerQ7u(Vxx0SFxAA4pbAtn+- zQ_kM%0T%mRx-}iLqft8HfAs$556$28NO*|$%2M-3d^-@Nr6NgJwkr;-@BCbyUnNEF zl{LKO=JDiR%9NEVS<1?J8gMyiODd~RlbKIRsx`bTcav9CTDjEA=2S!jGbH9t@o$s8 z);wF9d2&)VI>%OTDPzK~BDI_*ly3EHyBS7x&!@udEEgV9Mlx%-EO6gF(y%?jKw=8aY5zDdB&SD*2`KtMf91)T z1O6ZK8Gt_G^Jm4F_prrkz%XY>;>EUAX$U``<9**h?)}foJE#5LAbiw5(M3#COKflV zGqxSeGC?y06IC=HsX#yW`uQGb!1+Jo2E6|u{$@Ry*~RYR_cJqOzb#E2J3}-Kq=!I+ zXCgr3ebb4_Km5||wpljDvr5&}-c8Eff1bhM{XU-mCt1ILUhtb#N1Jai+V9Zcr8kIq zXW7mpD;nXT@tX2%$p1;8{MsE)h3_K@BQ?3BcunVEnkjKJf>u#5x-44|xMVLus4$3p z{0sm)rT_0QU5v#B{f+yRVve&nY@y^8(mAibfQ+06Ri>`Ib`nfVo{@MYOh#Wsd3*etBzFE zRaDICdg^aoJ(FsQ-w^a$fK>}msmrV@u2!<_Q*xH(u{WmGZ-~urd%h3Q(w&pi-eq(@3d8 zv?{a!Qj1GM(khey2oWeD(m%WXI`;(a_Cbsg^2JYZsY)dx14^YLG?W2F1qz~40#GUx zAwnP(NkX)Og$R_2gg}&vorN?3N+lymjS8U>pp>Arh|qx}2|-8*6ahj~pi-g*03Cz@ zG%Be=4JfS*4Iog1f)EWNG=L=llnNRY2S5!f0yH5&hSI9!fR3-pE_`DE4cQ`38prCR zb|PAkI8ZjSMC7O%5zvY)0E%Fh6wm=pAk_*ur~yp^2@tfYK!pHMsI4f9(h9tSMZ_v@ z5%IW!r(~o8kpXA`G)FR^E6EX{K;bH)IFzLllm>wi8dRiO6dF`Sp+HJNDF8;6g$h9c zqzYDn2$i5{6#|4s3IzZP1)ymKDFLKWX%J{oC{RjOT0vKv_+v2 zY9TExf+1=_0HIL=kU`QYngLRfISK_LCWUAQgaDyLN&r!41sYmW6NDhWlvU+QAe@AJ zkxd{8$xvto3J^m`CWHlPP;`JAK}?5mpmHfdNBCeBG&Ctf13~~40Hp}hh!12`bQB>% zlmkN0C{T?6P_(MhC{PFm2+*KXEhvR3w2C1}05qZtLMYOLr6P++h#^7NL{mV3(25i) z(x4Qov?{G4P$1HZQlJG2pMDud4ocFZv;e2gZ?F?)VT*)^@Y?nNkA7e1KHqOP#TskM zgnOx-sfU}+KcSHbgv_;0pCAoT7M*zrC%uM%NsIg#E08M^j6gIhG>b?j0<;Pgf)oIh ztqT%>P#}>45df5Z`?Y&k#;gtfTT zLs%>6_j%vep!RzqzY4@^VOBtbK2hpsh+M?>CmqQu447t~m>ru9dnQ6w`lUu+> zxvdUllWz)gv2dPVr7hXYZsJtFPL`x~luN90FO!nZtf`#6X7#(O%%4AJ-_!Ch+=J;^&-rV_VyL%>DxbW}3C%vdjdB*UD{BUR=NeVci5PD`2nlRnW4a=A{ zENI}3F(SX4-#q?hi~VAhw%e|A;tlk>_V=RvVgPi z=-ABNhbQu=Ob~>~NOc3alQ9Sl((OM6@$V@2G+g1%(&-DZlA9aoTzFsfNrUsz&Ucvu zvKz$%?J(!7IPA;`;S9O;XaP+UG^yeTzkM7kK;8y{4N~SE4OIzB(iBi8fzebA`?iLv zs;H)hfU2e-YN~;tHD!!BR(OxyC*0$tD}Niny{cQ9Xx2L09G5?dwgD(#YRBm7;Is<# z$fNpsu*ZpqpWADOH<^X5-$BQq87B6>(0V-o57Jh2Sl^P{zPt?`x5M-)c|?jaWE7FO zb}l)rPGqN9N$|Pp;BXw`8?P?UQX+eK{k;}y4Rj5s46h;2fk(lgbQ*{$E!Wd!zdKuT zw55Ew%_C1w_c_wwnbY+DS$}wQ3uARBVEGl;bO%?E#z>*MR%#Z^^_)4sMe2|EyITJq zjJc8SM=3SBIPX)Zu~+jLvIK@MN2UgN*DgT>v&4*+lsW&%hE1XqFHg|t)v%dC1_lPO z7<6#+F#~HsT5ab%{N)aOf2B*=fK_mlGHIgo;$9$v>Kfo}A=SzWLD4SBjbSek@U}>h zhXD_B$Jlnl5JXQpn-t-sz$_UB_zeYM zof16|Fz4Ub@_C}$|C!9Oi42s{@5S+t_Cyh9)^PXg z-FIvcr^jpBA2K&<_4rbMW6g76nNPX+OG&mW?L6P<`x09pZ$0P6#rnoJ;=`u~07vUu1i4AfuRl67|S2h{3ZXLy_)*72c zKwo1B;e6>T27EtW0kW4}b<%E+4mvu%d_5}4IdH1nJcQ$;jy)||PGh_i0++e{Pq++h zC0i+|CQe^+(#Ak4nSpIdo+S(s4dyP@D3?H+Hl^${Wt7IzTKaVM=`zBz96lxI=2d66 zY;woObEgX9RZ>Y(`N#>_p|DeJ)f^JtrLO5UhTm2+Id0%Ik%%S)mIcgQv!_51L}djH z#M_9?GD104=FKb!aMQj-ZQwzTV_)cBnQD;0O@=er`~vnk+)4y1Z0P5bNNF^XvrdsM za=CA%(Uu`{C_Y*-NU&fpWNE)**N$be;`3{boDfSRu9Akb>gvag_n2X3#ct+woFsHJ z-wD~%C5CrU=a^QrrklxM5^S4uXO9Q$+f49fHG!MI8@eYXY#GWM?l~&%%BMCkM`w!n z+4^Cx(QO#KxF2AC(=N>SM2B3k-kXWC^2kU=z-~y;>n|~2Noec@#FnBt&`c1w6~e0u zgf{6GZY9+l1thjzJ}WYbC(2l3E3DRb!)cb88fJGGHrp`91;dFui)jOf&~}1&K}7|9 zMw>N~5?1Ot84^RxdmRTS73c2#z7};9+WII=8$>Y{bmW?o=AEQ-G`ae^?rY zAweAA!>};uNeE$*8HAac8`vp0kxRM`i4zo%mWnq!*3B0*_8kaOuJR3`$fNme98YC; zn}kNy5A`gPh-+Hc)RftR#o|ty+d0ZLd9rC`dQm?~4k`!}H)hN>X|rMiyRNgm*qc;# zzez>s1)|-P6kUZxLzMa8?@hbn&V0njJB`P$Cf9*S)Rb^p2%kXdYxmFC!T6q+ct?8u z5@CRT>Q;45l{{*DlQm~Jt*n9q79T z#y0gXMM4F-$|@F;Z;9@PXA6Pxidg3)RJxM6G~L3~Oz`uSZS)<9hCLi}f&_U4%sM|4 z?Q`Zx^NGLQE78r%&asJ~qU;Qb8G72{UwG>C{vToA^M8-oiBzvI);|OEexwsZ^&f)& zUavm9gWuV+i1V7m;3m6nU_E$FUhb}(FF*9+c9LKoj?Bja!byaTPVv%cVI1{x8rfAp zTaR#ar`!E+@r;(4FgEtkysMcU7(t^ngPAwDD(wfKE_@aD!X=4i(gfvlpI{a0mO z2k$<=Z4XZ1G|ozfG2HZ`e_KDh5%vR=Cc==JnmmEdl1z1`H->z#I%n1?2<+Hn{dto@ zXJ!X%Gsd5-le{EPcKkiwdvZEkkBaRF!@GaCxl;y04hQi5{SR-QRI^F>Cb`|X#Nj7S zFZZa19Kh|=Z7wC2aFqJ=L4qry$HCN zZ|}paT{nND^iFp-+57wEFFyC{1F2L!8 z%JBNo5Hc(jZ}SMGzG?0-4zYBi6$#Fq>{lC6YvY9fgB%P&~_ zsrGhpNjsBXh4-Rqc$9`AnU2vRIP~drprg}bNZHf6zdxTA3)}gaxqGJ;|2gfhJKy7T zarw<&gY5p|!z5%UP9`jFOb7aZv#~$F@PeTx>W?dpycyU+^0+(e5-Lx~|5@hpKLmDv z#6FIDOAc<4!^$RRHgq+LFfm_y{okG!OZKSvpLabu4O~CE>$uZ_V`uj5qUb^=)Yj>a z``G$1T+lhL_a%>G6R*SbA0yAz^3V}*+;J>t__w?3=?#KvR^#>J{VwgubnBhdT@FKn zMk%@Yc$^GR<9nDd!HfpDzIhUn1O4AQ5wpy-mOarX3O8KhL{sZDeu{P0tL?ZZZ}pe4 zCC|6bMh@x54jURokUmcPrqjLZnb+d-kz1d4N2so=R`vamGxlTcF$<(JMdEyEcYS_V z*QfSdet9X_ViXPRx-le+C4lN50f3wzN$C3ghWr27n9aZIEJ*UQXN@ZPraZoeX4bs7 zSFUINxMR)pb8$HI`pW6KyL59CKEp9fD+lKRXmgE~oVdZ5@ovjjmGh#xd$necaRA4m zV29Fo_vG#QYl$97nZ?^Al{UzZoC*6{)BT>O8XE?SwpXEsDbhR1#(^^hgu&H0Lk1v6 zF_8td^m+e3#_gMakIx1_+vcbLj}J+CyNmQLKA*D)Jj;JiZq*c58#QTRRLFl zZA*jP!Vr@!)>uF02Otv2^fl^@Z+3^I>*1eON@>}+-7&KY9iypNwkE|l;A)VBlO{$d z-~9gGhB~iToY&$18spJff^JR~zhYluNcg2gXMBjS$BHHQ|1Zj&HL`BP+&w|JZvuSq zOY2`&OksdEtB(oi>sQK9PDDt1qTCPk@2Rz1fAH^iw;l6&ySZGpXVW6Fv5Q%wT2@sn z>KXg6eDM}4*lm?zFC0%a${%*6u4`RLZAFXd9RcQN`hn1dGGr*rQg5*+f9z%amlRq? z%_W`N31O}Lc$4(@b;2uJ?8=ykbBX;WtO(HSEvPo(HOa)s1O!49aXHQtKcD;oAWG8c z(uc!6Xl^EE&~CLH)5o@ynBurR?P(W~4rlOvEAGYQ-Qm&yL`y4u_V4zD+*^dS;{}?SJtfmM1dV14qH|Gl=%0q|1lV4O%z_i#HHlh0G{j;hf3;m}01Ej=@ zKm^Q8NOk}H4&M(0+1!4(^ZeL!t3*?f5Y@Gs?$)PLddbyQ$I8Svxmj_!RJ%!{7MkOj z6srMoXQz^4Yg zwB5#og=700X#KhF?)sNm`ujVgOY-oKuhYLS=H^|;i;`r|@apaUziKJrf9t=i)8^UZ zv&X@ipG*WKo}PD<`#gg?0mKs~Ow7~pKBdPKWe<24GUcO2FKRVQus}(loe(fSZJ2d-U2@Db8+*&`qh9 zndNm`6VhFcFp4jZj`THoymkX3UxBd9vp#ssbme0ARk`;|uI(&bk7i{_6wrRZpXuz= zL1pnJn`{u*;fsBhKdL`ok2@RPjhP<9^hCM(%Wl$TK7StV#~V9fR+=1)Uu>foJOwlI zEpnu}(%|EU)Lx9ToqI8Qk{;FZi!3p_&PwxH!*4HX_1T$$aq`Zq7XH#&wAPHr^}HF5 zYma8u-;s4Rt!r)eR6^fM+u>C> zr0$f9S^D=!%O5UN@4_Y3ghkJU^Exm09@a%`XX>*oVcy3SNV&w-i4cAR^PPB+Ig>8e z8_szRhg62noU0P$=Ysp^v{X|(v>$28TuCvhpzu1y5=|hIP3I-$a+}K? z-h1x7_IE>XuF6OgCNN#Ng?jy2+huIb!(6l8d24`{rhY{D3H3h?ya`P$^xbLns!&)% zQqf&I=hrg1_}}8~&v(XUx$tR(8|K><`hP?X28At%O}CC*Ls0M}KyA3%t-$&#{kV>vT%R3}?V(KPWYBrM26Np;U(psZ9PTDI# zT=!b|wXa^1>)N*)o<_>;t@vbFUR5^73{Zl_cIay>K7@s{SU_>B-Ve_|i~cWhAVL!@ ztXf-}VKH>3|8CC?KMgL~|Bo}B^}uL4`cA@R+sEqK-G>Lq@x`v}%J!2Fnr?V%NtxN( zZC>-|#?%s6fo^32#G znR%^!KJG45nd>9w0<3ftY#aTxgJQxRY<_*-`;zYup4ooIw$%+X!yb*jbviH^p6aSQ zeX_r!PLZ>{ksy%%uMU@ILp~ck?&tCT%ztnXAon2>1r&Yrkc6n6-Q7FP`diw2KfNSr zKqjC0lzG&Y%;f?_}+ zzG~v%r#!Ywy+>NzR%c{5@IaC$oaWVf4WS}7utK9 zY#C*Z6;3c{DH;ipI3Mj^pAtoLK4Kzwl<@x}bulv9`u~;rg7FyT;Lxv4<6(`@|5yzQcI;rpYYZn}m?>YQYdcYvj|JcP@F4 zw5eM;(TG&3Y2hpI9iin7xo>BWXOXW?kK-de^wD4AXQ#aCFkHcV^F~7Glla|SNsH;9 zzg#~C9rRHTk(BI0cT%Ec;dv=VY(zZV*(j0k*Ah@1mQg2X%|MOgypEh8gOESt7x4lAAzGFr)zp$r zF%0Kkb$JPoGoS^vLMxh|?#3)Vr6> zzPU z82G*O>9KMGI4+E*;CLb$nd zmNTS!Zj}i>$7uw3L9!`l-?}yrFO;rc+zaFcv0+GWCIlOJPIGJ(#{MPLy4Bw|95O!0 znkor@<(?O(NPjkEPI*7;=QH%ms+-RtyIKozNCJrY5&FDHC4lpg@^RnIkqtQw(lnyi zxpTb(W5e@yefdMfKJUJse!7FI<0wUuWPHyH()^uxP?r+>$gt-s%i2wAp&DEl5EYqw zwaN;?0%pvf8c%RqtfHBr&>H@BV#9X@%c`e|NXL>@eIvem|o_arT~%lXOYuerG8Aemiy* zww%7w8h;sLSZrrnsAY=P`eJb$B}NqO6|GxQ$S)%{mTHTBPn<5_d%n?OQy zYPquRE)NNGzwo;z$i7EbN5u5_k+9-mEOzQ#dxc2{_Q~qw+P`dInh7Suc_Od|?Vd}T zDP7LmUZ&<3Qi;d#&tZLSLQ{6EkNCzP5%E1`1JK(a!R0!{7q4@5U>M-(BS_m9X|HYORFUV~{-GYk%Kj3`ui8d+ak zG*>EL`%NUH#6NuzNkL0$EJ#$VoN+i~l@gg{PE#N4Wl-W#B$`eUb5n&@Wzb_oG&xZf zGGZt~KiHXosB78QvNDsS(9xTo>`mkjadXVpm(u)qf5Uz=xhoL{8HWN@0SSnsm&lY3 z{MPL})+$hgYY(%Y)XKy0C0iKzXDhJTN%|bSWXxgc^B0Lp#E&SMA=;J5q}ZPW zQT)nE$-H6?M#AFx^!zt2>^;^a_IOrUv3=-u+3rJGY}`a`zAeEhZFx>M zq5_2#I+*{|EuFUSPaR~rsL;^ic#Si7h)ww>Nzmwd5J-XCQA3I(95eBv;|jS`LTsoF^1JnLnaW8e&H7v zc7M-MlsHkbMroQ57FL8D%UZgbGRLq_zC($uhAg3#zqvquMgx;bNx`m1CCX z-vNSsjlu|4wBRq^^Eav=wtw<^8E2j8?rsyHr!bmk;wVJ^wKi4BIDbbzXlA@hXwoq) zs6jaWFvK!zvmBj~JHI)EkQcIX4J0V*A6|b{i>lq&cppZ|{+0bD+aBSw++B%=$~M%_ z)@Wp%Kj^=4BVn=19jh~=n+Bs$Luq!Ho94s??pwN7sS_4JjM8Uu@GT-unXpC`?ZT69 znam5zUo2hB2p((xgAoA*`wNVuO&H%s`NUMa7Ncw3be3&8;{No|MZ~f{f|5U$7PQ#E zH)$?p7$aPYnUzG}Kh!+-%he&)y%^r0vP)TWA6@LjFlK(!->8`Nn|nCzH0TRa^{Jl9 zRxUY;8O?qe-bAWx;9|idQ*)05`|fzENJ2pSe`AxxVIee!_#g}+r0EW`6*$3!`gV=3 zCELjOx4CCTbg+4_o1}%aZaVy!#+~1OHtY?iKd^)eIvj8N4do{!R!TfyPo8(hMymal zcHE7hnv5QE9ZEJs^o^OjHp#NQ-*Z9ew-ts{A1qCV$dQIj<~GhwUgXRKTvqFgYxI|K zx@V$i^}cl6H@4#A*2OnPz4hFEp8u7_PX*j_U~V>H<2jmLctDtLJ88OW{Tz$>FP3&z zA!x@wGZfbDF@af_VCv6GiHfjU$7ba+qPl%D{#VoOnNz_MYRK$~5?<(ZVYe4B{uWfN z9+6rym!$KqG*%cE?UF6dP;8GYt9t)wmu~BbKa1TL@P2IE&Hi0|vmv;=+S?uv%Y#U! zQym|8%08^FJMwar8_A`nyw!{OD-?^E-gb;HV4rg>mlfOzCM4%nl(06s0 zCn)tVt6xIq*(y@oW!<`%$yElIeQc;q_K-em!;YyZKWp50)1}5qnNmS%uc9+Xvp$bG z26<1ncAF$tojKJ;l!`<1Z8XANoX_?2=^Y)pcKw)|;W=7T)(E%Ic1~Z8uHSXC=gU$h zC(xOPH17I-WS9_{0Bswo@DIZ1D*Gl^T<7TM>uw6%`*+ixjZaqR(Q(A`m13+;{_kX*S>es2k^8J&f@^tlnTklgX_nAhb zKE>0^9*;G(j&FUpX$|3nM3~Wg9F)0>iL%06b@Uv?4;}?(QT*z69jly1^Fy{gdA?%% zU_K{_PRJx9^V;NQ{(YCHoQ6%o-tG``3|!BZdz9yp`=ur`x>}rtxO_urvyR_4v%7us zd(sSB4n7dY*Ql(nv;Q2hRf}Sga96aeLu3KTxFbwt4EK^8>6Luq zKdmH?e6ocPKQArO?2w9Muitv@9_N#f0uE5bk+fm3OxqybelM2wKR+}WNw+twSR{JA zgd3Aej$cQxnrqOygwWOSA%r=Y-Lqw6};w; zG>dH6Xlw9&@`H!8z@u}T>#|n}E~}KFJl0|+nPXm#5k3|w-QS6~YX+00*!qecm)f}A z(Rp09@|n&`5d(mM7e&XHp~-u&)%7wIMuPqmPPg4q&9=u;-G+mG@Z!q&t|l+7mLv+TPNb?6gwqq5grJm?Qo>wODGeqK z(~Cb->DO@|5jrWK4jC7(-D!;l5y9+1%wFEL@w0yhI?%%*GXpnMXGa+qcjDY3ZG>*7 z1of=8c09|SPor(+ynT<&b@w4A-6Sj?R6o1e-w73^*9hI7=!&7t36k6%p=Mn85pbQ4 zjpO6q?+iZCkTaiv@77uJZUb5#@%3E?Z*tQ79+w!+xncRqsNEV_puOF|NXK&-CK6`K z*mytg{;qUo)RuYl&r#Jl^X={MrQe;`TuIt^+&MXZ%E-W!9v4p})0{!nMCE@?DsO>7IyCFa6p%eOxZV$!Ym&Rnu@%k9F}=!(k>rJRQSA3>a~nB0EljPB>gM-%BD zcQQHbKPo7(zgu;4Vk4s`;I4_m|K(x(B-O2Y6(iT{L`03F*w|pd0YH)Xb^d~lC7WJB z3u%L4FM%?@X;P=XS^WYvLCkVL*|%d&Ixmkj`*yH4ow>}GxI21nw9h<(mKBIU$K=v( z2S)fawT5xRrbEa*v_1_K-eGZ1b*Su1mg@Uk^Fhl;Q){iy|*@h$>aMv=J$VJIm){`dT0A+gOu2FN@Wbq_u|j zluzf1K}$M_g%0T`NeM337QdJ7fOrIo)!dF~3IDt(Ei+tqlCj3=2rk@r^{=q)*utEUY#i+(W^ zVz+LcQW0;}eZ-k;Pkkypl!RGsr;wGOf~%Gv>&QN%79&4D+hq(y$-f3r?DI0ZvLv!p z6^|uyknD3lUyQAk7)GX6RWYU~8g#XS|2jW4?}uZ8=`QN0tvI98C%wDxsfoYqB%rAw z=CDMBXN_T)_E!QuC~byEN{>2Ysc+8gTLH((y=MQe_^?R8 zv>q2ndXdPf(3sJs?NQYJxV0XqCY2_46qJbroeSZzMJ!Z!>Q0986WauubT+7yLBPPw z$;#Hny|Qc+`NV-FszeUo;vm*mX(o~sSAi*h;apsJSm-MHU)j@QMgCZ9ak_hJMkBT7 zB7TWe>|EK8rTs1ymIScl4QjdLcYbpc=sIe~MqZUj%g)eHB_gpQ8jseplV4`Ky?2KA zoL#%I*woRu!^)%K6EY{Okr}GY{n*P1zZ+vRbMEMIrUDxqiI3G+u`^_yc3ol`=Q*5@ zt>dTO^g9vS$h>sGRWQZn<`=nuEyZqFS{q6-CXdd;Fab%(dHG~46JZZ|GN*-U5IQL` zRGc?KA)^Tq54jg=YC!8sV7D2U{dJjZq6xd+&COv&1-baq&Y%RCDrYvD?eWTI^X2A0aFtC6feKF zbC<~SWB6>R7q_ZUbLgQxhbf6DI*J&M~?O}K@u^+U^z-^ zi8uD$PRqK?FE`vUVkXHm6GYX_uO%hx%)xp~@9i(L&T!Ys#vSZkjV5MP{u<7&<{qEv zUDMCoB6FaB%}o%n)LKo0Cjcy+B*Ug838OG*g?E2QFHiW_cDeO2H|uY-(J(PNP*-gXhg zJoV#W-J4eNPML|$KFS>DJgd7sH-zQA@~PiI;2{aL5Nn!tmqQC@T?V|$ZRy}p_=P|w zA+H|fb2Zn#HTy2E=A)JO`sEu*-46Wd)frwTr|FFePmS=Aj~w(ax9)Z;ZC>sXhbqMz z8{g)7#XZu#JMp9%d*ZY5Sd;hIzC^w)%Il}hKej4iUkNj%-2X3~@Z!H?<1V#Lm&emo zL0q4go#M9d-xFV_MHnn+9T(sGQ{47rjoT}X>*0>UQ=15??4;+}oj%)V4&P?C7tI|; z-so>4Z0GEO>N}VS{!mdH{(h$8JE*A9xi<3xh6M`g`oB%n3BB+1++Ce8tt%tr%{ga% zqO*8y^45+nk22HWiFcdYl0raCF=^`ljoV{qn|`v8`A55JN_jJL@|9a>qW7!uekHHd z8}%+JVEc(leAq^c&2XiJp^&gL_!Xu!g1F>L{MC(W)4)yXd@#?c&yz`-u;I`GZj~4d zap9N5S}X5;x1VLwr&^v8xk&Q4$e*gDuz#S2d=DSxz6*@7*2hieevfB0*4kj)P}%X+wu=II(9N$&D`1=npW_nc;Cpm^56aGR_+7gtfZQ1rBD~>QhN5mwAr3=(TX88wd7Tkullqh7;i-#pyr(T_-2LOR3N zbd5AdhJC(kygsVvRVLvaLkK93?Hm225*ia_Qp7qYySQT$j(*0r9ZptnM_SvSp1o|h zO4wMt&8;PD@{mahZShM8h)E=z{Ro%(UrsY>+ITF!FCV(68g4QPBx<76hM^<0cS0Ot z*h!o6k;LFo_6{E+4sTe{-oLEWFW-EY<=262ZtkuB94#uQa6bL{cN5}U96T>>n1Ryy z+M?HIrX;She;X+6ukQBerE_E14>VRykVHq=T>-DxNT4Iudu-6Ky`oKN%I4;z8H9KXK;+C7q0kWNA?}&xz1xF0;K|l zOh>%J|vTx>E1tM`jT#JN3vis!Nw z;$EzOQL2>{9jyKF>D&02G;E|QXDAQ8^YLk}AWh$Z z$)UcjDO63Vi85NZ^=pD6u+-pYM1;Wi#dVD$ziux=(+mvG%^Dl^+Z%{menaizeu`c5IcmF!Cd_x}C_xOGd}IWPHpJ+xIlN(puO2vS zb90zC3=S&UWKFZHGdpkKWNUok&{y01FQMrHMAlT4vA zo=n@;X<7JBX)>G3c-*Ft82jh(q`z|and8mwx;HyrOuVnPt0P3}9EmZFR<|D?tJ1cDKs*zftyI2a-^g?fSnwgdrwl*v#%*0`y#DIPJ5_RPoE1 ze|7(nLtiKHgAq!@VfUPv*dzSiF4AVi1WkP35?X z5bK&g(MatQEY@T=q9pf`Bl~`cnZQ-~vNy|NrV;jKL+1Kq3&6+`jBA&j{= z|JxnQ!+iEOHPx<>fjgu-w{d@9uW}BJxNcyvz((Ru=F!`)V`#2wm7{4gPbt7nE9A}| zLQyI&JhoLjcd7+M9k3EzPbu$-UdmJmmFywQI|)jTN;q(SF|TIc5l+dzVI9}e8=F=) zJTXXG{$gl^K=(7cqmCpMRWn9n)1BJ2t_i9)zVeL9rBMl?+`r4Sg*Xw0blW9iM=uCmF_UU9OZs8(twDaS#@) zGoX^&*+OzSpu$GRgE7Yn6uqPQkj2FsQQ&oDF0^cG&c1mK35mS$@)K=lSZK>BkR(lg z(er(H)RwleyiMmPKjwOT^um9l&txR*JGt2G;F2cenID&__?f+VaKkRa`!3}ol&q0< zcfTsS(bo{IB{_~e&FLw-v?X#Yr*zfZx@jqG%bHsHLo#o5z!*!3}!7Ziz|Lc~bze-q;Ksu|W0LNAv! z*-h`#lY@gRmpC0;bA9A1U^PctivoGmUu5M3hIt+kWyBKLNmmZ zQ=;N*iGHT57t7FRgZEn3jtisYIBH`$8&J|(`~VvLv5=2 z6y+$M9=dq`sh&35_F2D=dBi!f>J^L)b?hLH0zX_i(2lE(vC7q?7s`HFN(%$I8{62A zA))JS#X_lyDfJJJOS%s_B^Z+>Oe0I|P>><^b64~{K3k(6_Gx+iFDg0ZM)DY6^l|y7 zwtF@ZxNqJ<-&u=YY)j-60ls9xx|YKMHOKRKP3fdI6&;=2n5}Pzy3?qUL=`PEBs%8S zr?OLJzw|L>@+H3@l{GfzF{@Wkv~&4Of+eTKzI)!@ja9AF&7W0T%xZ8f3IOgBh|sn5?LUUG^M zgs)ERZ&VU=(}nrQlIbQKPyS@h-_A~F07l!l+4S=9I5QKx(1J%HM2U>C71Jk#nnKH2 z-E{A*|34TnxthG|znaQ{wsjk5n0XV&Ik}lX2XEGI*b~_VBVH5cHdTZKUCe3 z!Sal<#wTZaydrXJRDmMcc0)BhFy}cJWSgJ{W;zVZy1#_zVkTP-CGc%_QZ7y!#2O9J zFyFcQY2^3LUsbAO(SxZ=$r*Yzh|REqO)hq0DIzG>%arLnLK&F^Aom!HwRgHX?;Dmh2m1Dj=+c>4b(;q=8ma6dP-V z=Sh&*dA0lvW^80wLa*<9%?V;i1!6E*04NjdT+aNQ!AzG^`vFm4nS&Dv?#Xmj-@CKXJl8Uygvh{q&)%%1JI<7mDd25j z)>8+}GwH)2YKORX=0(x6;tDoGiO|DK@-&_Oh2x38BiS^Bj~5*I9-2kE9n_Wu5^4cVE^SyDuQ3Z3_osYa-{ z^FKK~kaCTsei(LGIs=;7h_N=p$dB9GwzZ>BIq^E0SZQWa2p1pX>|RRr^29r26#4Ha z&9Mx}jyo8L{)w-?R}2mNZzrnLi?ZDX>=?2HgvC)+5(=EH1XL;_$nJOX6A=#L z4A4nb=bRo0YYDYh7UK=yLyFs>3*Tl^|F`_16V>``hfscZ$V;kYa-wC*l%i_{_7g&s zq8v9o4x`zBN6GjcEXFw)jN_GqxL6V(fZ#doG%J+F#HdU_{B9$WC;#ZUDYk;F8YKn^ zp%OYsY-!D~%~+u0jyYyIa>u66du(o0c|Msu6Wrm>Nitb&rzBiEpA%fCyYh!U1j}HU zjt&7UlYZSDy4d!SgfGb%|4G;#2>5xO-S4G%`5NcSo}|U!8E3fPIrSs=^F8D}518m; zq>sH06Hd&@g7)`AAL)ly+`VWz0XZb+RGuN@ozp;tA?l^7V7!rDxpPRsz;gEQEKtIP zPRYNPzl`$6zbIyL4Sd$6px$RI*SIb1=DN`t(ys@sOP{KDA&TJtq!fA8X2 zjW>bMphr3yp~cUThu;Ck4{~;AqcYzm<$GXrKV|*=kj;}|bSjqg)Wd!W&5=7^Yl{xa zvxH-)kDtS0(ye^Q-PK9Un`cCdjWVEMN`$y})#zfWIx}4*Jub9<;=j-{f61pyKub|U z6%?paq|pTv6hzf2M1+)3Ql34ZNyFc0?CmwDtEZaFXPzHwH?A5Y{qF0g-%TVlB*njr zo>?@14@AO?)r*aW4pg(AL|9Fmps|a7jkEJKpK zmgOim)vnC8e}wtZuhsM2@9DeGxre$RO`RR%HRg3kG5e)v!Dqkq#~l687b2?jP$qOa z(v8U3oyK?mls?jktI4*0rPsXuB&T<>{gs%|O#Dt0?o2nDD_T zzNwhm=y7wleHTGr$ArIsYloaKuFod2(tF`9v`2DC$Ey%AI*0xr2={QllR8@~+nnoq zX6@&T_BBp|M&Vc;y3TM!Cz>OH@A!KSpGG*D{xcUa?IF(XV5yOo!>T7IdpI{{>qLC( zRd80Gq6ue*vX}75ftkd_*96Q`TM)&ORH|J3&1+L9x1r86uji9F%=po{5md{r;s(52 z@jT?y5WK^`F*s?NV1>RXOAQVMqjm}_^z!&+oQ7Xt#J%RlC+s>FQ@u<^GI%8O*BMh6 z?2RU>JZ#;tZ3;8ZL&VySu$}8f#+#rs^D6!*f=oQ0oE}Z#MiqiH&c(||zK>#gWwCvR za;l4y41WYaB&BPlVEg2JJxBMb#w z+X61osxIjff-sp{N_o|A{_|$hCKusk_tA2xl50^?V>zm;&!Uz!oa?6Oq~R=Y=Gh@{ z#K9rRg5qWZ)L7#=YtKCDmsHEwpK1K;zQwC_CHo$=`N&7ZeH!rZy7LZcdM4N`v8DLt z_a5fYe{u6WM)lgC*%u>At_u&qyu_su;KX zuA#(`^&W*|Ty!c`8%H$TB4ymg2^OnBU`QN;(S~*FC{nXgO$_yn3ty~Xvj2Y_Qh`iyW;j;PQmAPl0T{|+ArDmn@ zX7!qNhkY5(RsRip_AnHlo$T;Og`4Y_`98<8#AbF%EH)9(7_2ZhP{mBTM!6EuMfw^M ze;sT2ON(89K3N7enX@B1hv6a3>tevOmq3r7bn{e&U8*s5%Ahf z1DPb!y;$)L-uhpr2md`2IW^3V5$qswF{eR%4d)@8Po_N_E{5YchKX@M+t0`7&jRch zvE`maO(e;7@V~N6_ffrKHU<;B%{Pae5V=I6PEN0p*jz$Fc!Q!)NnC$#pV2yu2e&Bs zue{qR%)0PV!wmE1ejlF=_~>lvHHN_ZIpkzfLZ5{CYY3C$s!LrEtQD z`W80aFS1hP?CssOsd+w|x=0k1-28l*QMY0})lMt2Y)2r7B2Z1RenozYNKI?qjfK}< z@|tvZKNIC68uHdnRp8^JF%EfV=iTtU+$K5w-b?sT&HHfX(`|_y!Re8Q?!ttzl!;lU zfjdszu{YZCrIJ<@h!wU@3RVatRw_NlL#a7ek=0J@kD*dZ!Z6)24?9veIICz*w&(wY!CyoYoCpX$4Uz?7XPx~!kee)d|$)EV% z=jEA;e0;i7gN8U9Xcd<+keF<`_=2_pNNdm>^( zP;vx==FA>n<8fY+p3|S6eGOxY;*Ef`+o1f_yH;;eNNxGO^=zmQ>C>K4BW30OiW)&| z9#q7>8s=yM#~4&=K+Yy9J+=r^5BntIu}BftJ=wYTa5*tEr?1(sOgg4nkb|dgQx};#IXB<(*>sKc;jN~F5QXw{q$s<&*nT4{u zWXmSuv94L-MFAi}Nuv77kMok6q1D2~R$}Fz?(+Dvt?p7P7fBP(Hl)gJKW(SEl=&A3 zlK9r8)fqg=E6>-Zu$gt3rQFP4eA-<}Hm`)5axm+I0%hZMQ8LLikABVj=i2sZzrSst zb}O_N{+eXF7b_&{?YBPPf#$!CHmJD^fdWclA+4hmL<%AZfPW`MHw=0__L3d{kZ^B~ zVU_<$zvv}mX&}pf;zOUKVN;#YHs|a)pV(>Cvc3CN1)i?maO~R2;&C}Jl%&ORO#j8l zM(2M`tsCxoX6{z{%AGFo&VO-MvSy1D$|X}{ns@0>8kZZ#H-FIWB-izoZNDm`=jpFS z`5tW1X5kfXRn3cyx^onaE+%87WkMqKGlGcSlx34-nzoDPIVv-a3{USaJoIbK9IKTe zf0qM&8$%}~Y)&Kcvvdj#rP%(Cz5kc&r&V;}EOr^^N~YFlw5>C79q}IPp&b|Ju5J3N zIK0>0vRt{-^DOr@G<&pACn(#Lk9++qA@!Zfzq`=p7JFYW=)v1Lls`)4@P2~Xbu2py zM@l*8_>g5prPb0w2RKC`NuC_)32zu*XNjQbpXWJ@buSZXn58p0HPTL=4 zR@jfY?zsI8mGORN%dc3k#dUng1JzqGxWT`RiRg1r*d{j$Su?6MW zRC=)T+SvBlr4w#i+;;1nT{YlaS=iba9r8z_3LTH5|P>7_aic(=|0+NS#V)1d^p$G2V=$+vo1y=k2e=SR$~dXfX}}6$~STFj6c-O%zO&r7bkl1r(h^SK9%p zW(F!L`3Ox)YNrxRf{>uy=%xeNgVF`m!f`x!@effHs$+1`ebgTZ_9aof_;vIH_?>aBg6wZy4%yy{GoFndw4 z9IpAVlLL2Y3h6h@i$9{o$#hfnw>O!AnD{bbk>>c5-_f_{?w)7sltKJIUQEs9^6Bb_ zub4l(+DLYECJ>TgB!lYtANT(A^as`&!(Y6^|LgwTNFoY9e8ku)CP0aU$@d&cn5wA) zAf+}WbB-AUN>I@w{BM8lKQ;UQ-TnN3n}Tc%%u8guDJA-tj?4EJ{5>6k_ z*P$;z##j<&Z>3xy48+W0UEh%=vJS+|&6tQ)PnXfZm*)O%N7xYw4Q?p#Ax!%Gx%B-R zhvj{IbeB}`$pdASKG_VUoMK2G9nxfzLm{3h82)pP>say!#NPM20X#cGhX{8{s+jMG zw|L*_;VcJ!_x8QM-#fY>Pr5L75T}VOb?+CpFBFKVuHXDW-m<8;`1$!*aoR?rIPN~@ z+;5wDEFu^~C*B5^au84-NL@wD4MAg#$YY|Zjse4_$wDNU1>Y{@?;LO<4j2Dr!XhAt z!U%G2^a5}5WIx+vf4nqUVU<*BX=TKNl+-XpxR#~^Z31iO9o8pgP^@ccwL0b=R*Mk{ z5s1#jf|bA02=UW?tyM(xY9b;gim1JesJvKxN#dbE(11w$VEzSM z;Meo~!f4|mh%}!AG5E1-|K((QsB>hN$&T!i_qN91JCD4u!KG^iCLq$pf^RR>A9-@X%Y#Jp_ghWInK{0q?Pw#ASMkoGEX@Qx5l&FH) z2~9;7V8Lv%bIvuggdj$U1VJhds=#mKgGvg~qcBL^lO~G!zR%_VcI)}}Df64!^sMNCk`#*>OZ_+>CjZFm1bS4{tae)K~X9i3moBKHJNZJZoV1x`=0ExdQP`a80i491b5k!Z}H2my83rD&$g+a6d?`KyD;z)nmU@z!_Ntu?y zN02#(=8*k8z8~NWTD+a?J<)L>Qj$X+r%G=CAJoLs($fS*1(StK4MhbJS(#S*x)e5# znGc`j(r>(fSl&PJ;i16nSBDZ#%-2FNcPM9kT$WV9Bo>>9%B5Pdjph}%1|gEsorgXs z_@L{5JGy{@-{x-~d`{xLhAKk%V|+RRgd+qMqIu{xxNsUMj1Cvq2E>O+c?_>VP5F{w z%z$t&Ls^p$3Aph{-`by<`OzOQ2hKz3bl~)QAIbETv~zl5r)GVd@bB)@E^IIBhe*Nq zzklpfvXj2ch@7y4Awj>!TQ2v_)ghEiV$8b>tA;a_zpmeY8>e5&_rH6S!`4Bx(O8FGUm@sv-B>%vm(pN z7m~L7=PG|E%{QAD($BLt%Uv|i*Tg-*wxq7n_D1-ci>Y*^u(|cne9=tYbwT(mnngeD z@3f5&T}Nj|Nv=&AINr?8iO9%?4ufmAa>h+k8@-!B7&Y#AdWR2f0~l#s=Pvb3coFp6 zk8rslRA7vs+x{E7KFc&a}RrVa5rzvHL;HOLSg#Ql5@&Xhf)d~>-5H(2= zLL&k6PXpO81u+Q`41-lwRZuWJA^FDDR z9eXM}>H1Z}{U6QF$r5|<`$^h|pk^wngqv7mUCvx>aAJ*AmS>VoHz4wycP`|(r~2pY zl@oVl+YwrZ2vLEDx14RI8eo}-K-~y6Hx5T9NP*zVQx`o`h? z;7poBu-3rj?krMII6aU|Q;?mRG6`>vi+f|kfrX;}uNw<9G@VXGgh#R{e}A(T!=EwJ z#e>Q!gm>MaK4#yPkExBAV=&jX4Aq{dmDV~dV|(10ogpyyP`c})jBQQqnuwqewiM~s z!o@PdKYocGXB}`P+=4&YVe9Bof^Bn`^6cPfz89c=Uw1y*EI#RO;KuJ_fOc@gxmehWuED zNWsYY90+72$Q(|bH6LLi#ad2k5@)xwR(2RO`;RK!6g1pBN_=!imlBf#)I@Yt*s zL=99A=(_cR0Q@~Pt0cleB-#vMF4$fUdA+ zxST|VLpsfikQl)20s@6c{XNqeLrj^^dCX0l%Be~~9#qK;bJ4tZG1oL84rDi6xO(oJ zY)wi(IZDQbdS!J#ZtPZ&|^4+h)m7I5D5zQ3&c)GU&*?mpirM{vB?tZ zK$Eeq?QoWeoToVxOk#q_VjyxrhaxC=wBQSO?s$fC#Vw6MZ-Gf-NSZW7njdlwhREDO zB*%If;JtgCJC5Tb4Hd~0an5IB`4Q9`Xa4`PtVlowhE0O**Pns)9u9HoS6{xNuQ2MU zRY{*~f06z8zk1ror;Opn-ND9$$uK7JnqJ2=mTz(U$x?vf$FFE>m#NqT9xdBAWkpOCeZa-rh``xAAhZH$?lQh?{x zCU)8`eLVaPAIxoI-Wr=(O*^~qVz@r|h=6d|Z4)OGKCKWY8MtB^kieFTtAc6YH}t<` z*uszNGa9L|Ai4>&HUccP?HrgZC#m6%+S6(NVs^H`ymX&w=iq7gATtsXwGDR`Y>pDz zV$RuWOQgEYc;xNn6wMl!uAus=lku(n-HUpdg6R3b#B(F`9+7f>NhD`DBqP6IY!bP# zZ#09LG#-Ki*cc|*UY*_vF_hl`kgCNyLeF_xk7=CJ-^RkTR!d=Kz{ts~h>$|Uk7d+lh>Y zkYrGB_-1xqNsx*mGRNK7y8X5Sm-9eP4v7hX=QrI3#@pM`*RAOZywEJk{zQAvrwz}( zr`1DG#`V_h%)@hLVz7A>dip(Nyz_3jHm-m~EM_=JUB+i8+#ji$Y&A;`H^BD~BtZr2 zLQLKh4}pkCM;@U-HCKOa(Q>kz6QS#oCvpTuS97rF_dWldt33KXdpAZE zU`N*xoq=L5^KS4y|aDct|@QVDyj6`1pP`T4$F z4S$7aJEh}ay&myX!NVnV8W=_!@{wInpFYmqKjit?@{9g^vD07FrA?k)o@pQFou0b= zg%A1uepu|c;|1}u%Wv|}CGC5Inz-`E`>CI@SFBI@PyBM8VwDJqRr)VCM$RQ`ZL_j{ zyGT)Jh`uEy=$R{h&(eEjWlAV?BYY4;89IN^ zqFTmjnII*z#ku#x@XIfko$k+=xcdEY(Q>H$TOY}OR=0KCHa2+rqbW&4Ik^xXna^HxxcxpJ zPrCh9?--)m`NXE%|9&Z1`X0J;bZ?E8!C+JY!gk-L5d9!LfKg*+&riPUmlMcpB^8?~&@7@_U=; zZcLgs@k_%N<;TTGHD=|xXP zuoMyyc+#1k|1U!J$UQ#i{12}q&`524cG3AF zNDYEJ(9}J@T_goHoDGb6JeLI1H^9~n=o?G0j${Y3@7Qp$@>KhLj@fSV8E>A&>`kgA z69{kgUa>L2VMs`)Iq#E5Q~a}rqGmb~GkzvgyY%!!G$FgiWF0%4$!}uyKUL4{T_17d zyV2>G{?Z8U+dL+$@3{89C$4|@tf)TKZUm3}HN2;~DIbT)@AKbwocwgRGS|aMC-&cJ zz4<*!L{xex#t&6{dcQ@|UoEg@geX_x{{QK+dhb8lHr!s6CxYNb z&yF-QSZA+iXBrnGelZ>i?D#EBUR{fajQg;)ic6;qI4U;3RrwXez3SbYw$z%@CC+Gv z=OGWzuJw*?^4o!STGEfogpiCA**#F);%T=B^7I>^{nt2WqIdYdS$Q;*D?%`D$=Mw9~*BEqD>U>8&le{a`3{m)nG6JI# zXQ{$=*_S^02LC^dwv@lpZPE72<;`F0d*|BuzS(dVS+yo`6I1luS#>*EWwFkre+Bnh z?^i$1&m(N~+c2#&)#{O_4!UDT)gBYu2dwko7fgtS2(B1FDS0>gV$@WQ`$=|TQ-v&u zwNuI5mJeBRoqhZMHm*;_S?qeA>#TY1%Y2Ly_0s~Xdf^q(=1@;fR1rZk?$^;0*-GEp zzcbHHzMU}PY$|Z=p``b1zkJBU*W&e`jjW>xDW=P3uD4$fO*-hM&@1PpNZ2WOJQxYe ze&>Q5Ot%Mm&+Jr z=dvGj@`7e+dmTyX_2o58+~~Jqb8Nx1A*n_lP`VSh>)5hCL$s&u-=B9!2|--lx}3Y> zNs69Q&_XF^EwV&93D4OmU6P%vhaAm`xb%GP-1ry$qcPlwZ*p<445fc;dE`0J?t`0$ z2_C!GPwmg6s;psp9WO6-#ji}*$bP6ep`LY*G^HCY!}rg3Zx24q-vr{^=XSn+Ze7{% zuLtaj&+6Am=CxW4x>a$Q!fwQEZb{3EU3(H*}`?RH*znFpiQ zjcvdD`!F`KvGcWw{7%xD_jg`gCNAY(Zo6H-Io;5Eqh`uwoJLQA&&KJj@p@@<_2n5t z#Pjue|GHV1wn`0U-K?_Lf0E;j?y1??(JImJhIPk};TS{qb51J{C%U8VyI~9TPrj^h z%_L{Glf%{3=I7w(=axQC++RYiS4XbDeg8E1`6sc*33nI0DxC1?_U`%1&coN{y6-FU z*`{Xc=A-p?9W{~{gOu*o`uhlHUJT8`W#kWe-Ziz)6J549U(|GS{r>|? z@!)Kh@J6KJ63o_(KiN#>?S0z|kDsgc|Hdi8g-@e5h_xm7Cau3#$6r$W`MdZUPV>2G zw$h}=M7@#xP!dP)y2FqkY@e<&J-je~bRVWpvhb+u_XK31LEtB8B&Ep3cT@df>dvy>55a7jb#5pJsKJVU<4J?;>|T z)JhCAr_q-FnsLIc^Nt%;d9(EA?H2!WcDpcW)2Q73wNK4b5<=&6?bfl5SaWnyj(&IO z>EFps6JBKWlZHz8=)$iy!nz{W=(SgsWz25p{r^`Jna=q2{XzyRvq;t>R25M-&{drn-Qd`ygx+#CP^rLxr-PB&@T6C4Mgr=Sv4SP+`Q}_oW29$wq)}tHizqf$p1pj3 zJF@p^!?`7bDYk zWlFy}&&!VvQz_%kha)$piETPOwZA#-^vcU^^dHFbmKdw<@)W$L5#6&0qTTI-YL*XM z_v_bsw@x^0$4B&81P$1LNjlIiS=^v3i-hQ!!ZzW1Mn_{0C;j=sw4 zzaK)@XYs;W;GEEp2op`uMTlNX@Lf{FKB02umbW%5kG@>Id^6mz@@bA3#eK?o^DjjT87TuG+>~iHj(C9JN zq_$q+W+JUQ?s=Ng_+I?V)q0gBIFn2N%DMo zPk-L0!^5EZ#44UV`EjhvvQCRiG)LP?_+)s~4Eq?x#n*2CUhTPIeioYhCr>`O>i~)N z>4b5Xd2XSPS2WW-((T(GYjr5L*FcWUqr!87f^lT+ggws@Dal#Fl6y_oH-Ai~Z{g3T z6Th(?SbTjF)nvINZRX1P;H3vl8Sf($(p|#=JPWl;(|@A0 z&b{mP?B|o3+t1B?Z=Ge=PI)#vJYaiDJu>ON^yLv=2Ql3+8o7oje|0R|{BXKkKN{@c z%PONiUa_K?DDo51no#*#mr&_@qipuY?}R5GYBwFOqPVTSkxxCThR){U!wj-)5M4bS zrr(iQ!_=0B-`UlJH|Y4@cObiq{V8R-Idg0FKhyH%UDfGMzFFhZGbAY;7ux*`Qb#BK3m^^&z4|8664-Y3DVLgyD4=;nx z3g#u?rj*{wU3IDIp561bM+%qjzZ=x>^yBs|dpkN;g|+YFj#}^Pe4|^hqx0>*T>g3O zIrctw=3}dzaExE(l!|Ryb+_5m&BXkjik^*rk%PEQgsc*F9Loi&4_D>rpnwVegj7V5 z48YYY6n6%tDkVUXh$Ui*BBH2>h=OIyrIgSxX#oRmiU>rSs8OS1F;ML|5clxow_w%? zMA8sa5C}yQksw3@QYA#e5eUO1G6^UA7(~>>MAbzQK*=dkR1CyI%;`|kNJJ4U1t38U zMFbNPBT*z0KvFitT62wqIrBMx2RVXC{5im0-1q{T+1Q8qmw*!O}5fKv+B-BMp z(lHSeF*LCtlmtUTB_x$WKvGP-@VFAjiT}?*yosTOm=2^PkP#6C(yV>m~|Nnvj7Y zf@)ebjD29!62wVRL_-ikB>_L=v=qTpRFg8(B+ErGLd^_>%RxhZHawh_5KI!s#0Dk` zK$2mkhScRGtdqrvfDc(A1cB(l_CQffF{v$LWG3qNOD2QqxI#%tqzE$cP)w4bkT`(= zy=8WR|Gq!+ll@Vs|D}ij-!nw;#e8C)|1tyh`d~d}RR8NAtJ4uq$zS^Sf7flb|F`@! zcmMdn_)AFAzg#}41J?jQmQ&Bq0rQXoht2^HDFovJ2j=^|sDH$TP}xvE$wUL3B_R?Q zTpb_TCMp5+5}uycfxC-%`ALs4W0_E?F9izF0xT&<9k5=E!jKd*x6KraCPjqoTB^?xp84n;rR zn0TEO12`O~dzO3k1NYgXj6VMn?R(3ps-W{U2qUEeML%Kwz0r0imHmtkK!h_N%?!f> zeW%id1`YUj{D-JEt8q-}%1~t85u^96vS_Wt9k=_sc1aQBrh=5#qXeTLzN? zW=i9g<;rYcuZsWKb!5~kDlAYsNMxAkK_)-T$#qSC%)smF@=8s4hDcUjWOBT`hN@;L z>^q?TA4ekmD5erL>HenT(7(p*xog?)yQ{0IH(F#u zhaKTEgzuweg2Uf0Ml^O4`**lWgbt)9ZLS@{X=t0m1R&jFRpU#EHBguk37Yj*B;Hdp zOsG2q*P&nS=z@z$#&eCmT5{Pf-Bj8W5F&YhpO zKHeNyeUI3NwS=F8zOPVe)7y1uBsbW&d^RKh)xYTB`V z#U%wUr72spsZ6pUf4+V1e#$<4+11CqJNegNJgu-)E1nH=c4=Ja$e`bJ10=`;YGR&NyEZOykpw-nXa{z$~;uNbNXqb(&XV= z+-${^pBqU*X}P5-uv(Dn`?8L{_4vkZQ_HBT>rwg75i+86z0k0I_tcfCEl`Cxc$FPp z$9;0R=Ujw4kaybinV{UyuHz=$pAF9WTaGKgkEJL|!uzYLq-66$_kL2lmpY=<>AT;_ zTIfR0sy&)KRXxV!^HyY1uAeuYoQ-4F-qlA(o{Lq8-q9$XKfikOy&Wy>{M6j`9_N~8 zaje-`{xy|nF(Ps0uYC^v$kE?lI@f<`$BS#S{uHm8&SBnar=0WQS(?`KtiQ09FP_yC z2TjBaTI`r$W4qwMwo^OlY_f_(9tgEcuq?FH6Ywh=6I-={G zt#&TE@}(Pvx%Q6N-;XoN-pFX`-l{KjJDcg-8$N4ted+hCTkpf&UT;T#Z{}xu>bbwOzq85IYwC;Z<#JW)eox0g zYkYC;`8P)AOS^p3sq@ZGb2`=H_?FXkoULlguX(K_KD~Q>XfLCqwbLG!^?la9zfQ9{ zy=9|izqRI$?fK)QA0gpj-X^L$#^?@Asro3|RDJ{q3wk7t^BF>)y6_i6W~ zs^)M=z7k!j@xZ2g7FrOW%;~$!Ua*)@E>36n#(e2b1t@q1)-O(zM zwc~N>H;%3M_vE}@_rqD9YEJ%Z+Tnb1R7kZh`YiNmGvr>^Ap zadv454SfZj@q&s@d$^;7nbl~a}F z`qnR>9=Y?bb4EgnuGF4(c2Ji1#phkmdl9dbCm5jOAdMR2Ej z>$!N}8tZxG^iwd_Dc7Q}S6$Gjs>4P?=(~kF`Eyrm-5B;o%FufeAcy?dDgz>_@|zZRJ3Wt zRy3P!J=N)KmZa-NuNJ<~O1V7hto8P~Te{5`^)-sz&pdtKnj~IC^tx`1dD+=LeVHtI z_Gc=!ICP8U-Bb2!RpzecB|0)Lef4#@o$=KO!V}U+TM-3uJ%8b z)QtkKF3#f)NMymRWUTI~s^{08CTRw{_IdHSWT-wV#@DJeqrXl|TRf}1X4HG%QGaaL z$M4TR9y+|9O(~w|h)XH&>(@<}4e`p@idxrNuNJg>t5KQXPBft5yq#&6k)2mvvC9o~ z#$we(Li;ZDY!}xV=6Aod)}1ro8EekG&zBooUM;Co@@Pc6_Ivj>cy~B;gP!dzP~A^X zDFt(O{OTA|q^H>?M4T%7GbxgyMXqVbs1MRy5{%H-!AD=Jh|__ zETs~({`|sooZnV&*S+EI%*w4yq>-Opqjkv)5$dk4ZC9@l9sFlH@5-h1`6+L?i8&+s zZ@S;nCCu_?c$#bN)S}jB&hu*nR5>HJ_I%~Uo-E!^s=w3+tPTgChbHhg4wElpIK-hR zF+IeNwss1FDv*w$4Ki{f6vSYBM;W~(M>@|%6zgcdCqD?J-gHI;BKP}cq36Y_y=`mK zMHI)(J4=Gh2ob1+ZJexMLQmbzBPkygL3e%qM>&p-=!3sMRLM5;w<3NMel_dHS4wOe zp^Qt|keQNDJD3BSW+A-&->LArvCZ^dZfX1OQGHAbN`ZY{;pUj37IpG6Z;+78wcg=y z37FLI96p&b#dy-5F8%gz1T;U6KM1~$pwOMgXMf+Y@|FB2P`ghHj2fS&5aqs8^G^sl z+@q9i$+tK1a>r|i7@z9N^qzaLS{jVu?U?p$7p!^0x7T8lPjN{6Kxim?J`!QrZ|96H zR7$kcJ(I9=SoE>?EPZ@WI&FjPvfmidUo-TO`b9PKH>@rYkdPoyks^Q?QP_k(i>$WY z>i0S0)@#qn@V%XMYEDO9Mn`W1wu&STKv3~6^5=aSCd|pheN7{K3??ZhKKwbzyEeq6C$%a_BG3m3$#93USyAGE?|t>! zbe!7C(JzN67>`*Y4ekyD2Umki6qywu92WXPr=dy$x2nY0|B zr7)X_XmE(G4Xj8=%zGxFAoF0v8Jh>T(&@ykTPE)^oMs29%Z{g7oH>$pJK*z+iA8bQ z(Y7eSW`c@3ptwky9?FBcVU-;Sm<|YtHfe_#k{l3@4@gt3&2y)zy3^m^74&S`hi4=- zaax6hh-Ra^HPY{Q6T{i~Z&+wirwJ|8I$^`#vU`As^jhItC%$|%${zI&IE6&ge^Ijh zG=2N>JBl~OG9fhyiOp!5M$j=dsA5)q?={f zBJGTAqDSocKS~(s>fg>86Y1LRPbqlow9u0C**;at4M)TT+bLtI89sZCuRaT-%Cw~?Qj*%dpjvM3B^v7L8lzQH4aJO876?i%%Lg<$sf7~w z^jC+<`}4lK?y->b1}~?Y-kyex0Bk^$znDbEpH$T$dEn(n?&cZ^C#3$zSR?O-Y+W65 zuD$GJGCV|hA~gy#Le$yV$gQPh%xx$233PNXf`~#iEU=eCvSQDec!WkfwdeX;_pVznJ(vaVj0xWY~r`kv#GUvI_q7ouf0B&z27EMH}Nl>_nrH{lN&7V zUi8+NSDG*C(zl?KuhgGTKe zeo4~ydDg1AS>@hb&D!=~Ip2P+J@C=wc?c{+ghMV!g(Vt3$`^(R_v=7(Ci*G5<$L8lC)Kld5%oK6H|&wscdN;PbA{X!N^GE4n+k5KF3|8`&Zw| z(5kBUH-Ybza#7k|ay_IIu?GW;;n}|gq+Af97g~K#I_!CG6~?Hm{J-c_`=r(5NQI&k=>8i z4kH3RLxT|_!E8ralcY41B{MS9NhJ`G#2Aa4NuZ}|?Tz%$P^Zs}K7D=h+^JSg7(NML z;N5OJc5EAhuCEreP&% zxM?g0buqorNesZ?ajF`_@O64tJ{GQrAnSX z_&DtuR%banJCQ2n{W{!LWqj#ms3=NV;h(d@xn#3k_YY@9F ziV-G6WIoU-qfv;_AoL*AU$FHr;+(x7B^t}q%_k!zMjWwvS>oyFp0-HvfL1s?t<207 zNNhS0YGJ-vL#8rHqDm-o9n?ixWy=#$M4>>%-#dv|ONms8>}2(W5H6#6JL%P^coHrI zyDLhaE;+H2thEDWDHOHSYFk4Jgdh?9n0mXjl{l}NN=YfmSI*{qJC$aHBcp?Zp~lHP zpMp7S=#7*?*L~VFbQK<`Y~h4pixdYp5@yQ|Q6eh7qUMBD?(3I&#pf%gLxeVkRSJ

H4``D|1eeJ^K*QlYk28}pX{9q<3TRQNlfrJ4Nl;*(x{}U^2d`O2TVj(_9U(4( zMb}Q{ej{X(EqLEVbA4m^n5fU5TqCZymMcr5PDv8f`H8cnmP~!}H7e3Q5M{Galqkg( zT5Tfxvqn6%LwHI~Qc#5n9+LpPAu5UJGe@D^ao4dk)6p z;69zsy4T7{R63!Ld*pdTzX33MG4^p?($ba!*TsM(fpd-s*j zNywdcSp=dXA|SDS@Xe{|nzU;$tYa#Ta^`VP&HD|crbt;SEV7ijwlUkoTN!C>hYn&d zJ8z*w5|QFHQ3u5Ukp%7#&Ynry9uz->h}qitoLpW^%K6;P zqt3HW@O+Py%h6Hdqq1FXXpm|W7}+OeldrR*U8OP6tKvS%_bR0_nJTK{#tk;c3(BcX z@9!do`QKgmc6d8VqI(ZLAt*=~hQneq5QH}HvQG<5wP-aA(**=L;S9#PT1bjw)GsPu zlEp8^y6r2I4gAVi9>kYzh?6FeRcJ*XDY00D3Ihe+(4NK~o}Z5ritR#LP8|wTdwI1o z#Ie%4ICR%%hA>%M95|DvkAB6Q=vqZ6Ixswsrgu2T_Jfr&61owZHc9WuQ9@g8jr|oH zlt>jDgXvZ-{+=V`=Jh2CDEDbrO8HWtn>(EtWYm{w1(ZOOIBDMyUn^7;*+PGJcRju^IYS}-?^&~$tahXfqHoo=d|HcVQ( zs7E0k)K6W{N5o3(pzc-nd3LyR26pdRLL4=(D59W98K{wc?_X4iHX>1WUdi2^A9)`i zro7(`dT`brfu;;%fLmk=TQwN8+>~A`d=XX+cOm z#Tqwj3>5Wi(!&5VvhwNlpkpNDW=f7k)vjhB0{X{$Mt)`qu{mh z5yaZDiGBP`K@vrt`SdGj!?*@diRfQs!Fs-v9i6!3wTZTj?IWH3Id!SO#r{4cxCk_B zViYux(iukdSV)nG#x|1cio&=cP_)OKObR>oz{c=0}yHJqojjs6wx%b?1@+^yNs< zA!ysgA$$Qw+#fS9#!E}@MHq}?s`?l_;U}19%seFM`y}Yo4adQI2Z!^0i2MO2(>J9FxNpd^sI)WIe1@y%WuCHj zSPN2R9CpI=r=f|Ch3pm0?+RX;5!n)q@o0U}BeS5j2|@JB1quNh)*ZVhjTBC;CxO&7 zaNCT`@ecJ)=TdeZeKpriPw8l~#v_Lbu~%D>Ug`lNJ8#AG-W)OqvPU8|BF~~QTS(5u zQ$lehor)EoEK}BrF_)<9>(O}?X=~yQ$FSFZ%oP+k?Hq(mAW*&dzAW}|kscnR(ZhkO zc)j+N>({d5!d@YX6}@zLTyY&PA~<>YaD1cb*w3hE4~C@rSZLceTRcbFU6yekKp>y6 z!vq?JaN3@+ucuLD#^6FOHOjw!YJTtB*Q}yX9nNaJ;KuV?FUs84I+M)4FOJn{@x=xR zV-22GjdfkEm6Y6)j4Qjg`@8uxUqh;fVdTfobE_tAX+ktY4UphR z#LOx{?D^5cnd!1Rv$rggVumtCeL3OZAI|sRr+SZo;I0{5)S0=7h_FTIz?AI`_};o# z&6FAX{J$R;+tK**Nl>SlNb){h%AKb0={*yh5O!FZLCT@s#|0cXC$=(7)FMidtNBsT zEBHMh1~h%}!b3{YY9iu#g9ixeKH=sVa);sEO$%3@-*lEls2{B|Y8i*9?MJ?$94oj^ zG%omH#^+Y}`K+J1)ZWG01 zapu=e9UC*PRcoGB2-scOaqrQSOA>DyI$F)|C%E_{;Nj*m(hKzQg~HL%faVUANy99; zJrL?V&}X*g^_;6fx_#-8l2M^Jh#s@)Mx*CO;wdHYzR|JtFzeIHkEafT(058saJ%Oe z$Jf-?&PrFN)O!Q(>*`xVmJ@HL^t|rm_F*3U=$;x3WSTWH5;2nq!Tl(QP~*>~Q4vDo zgTaCHLXsKG%NU}rM*!)-hT+0ufr=l3@8GJ=dL9Oi2t7t5wkY{b+VE;$!PbviX`wO3ym3tDS4*LUTL$SgTEsQ?Gl<=10fK(SLr~N8;mE9Uo+Du8%C3#32qoNXhI{l1W7C%5@LrOiZRB2#*HM7UW72 z1dy9#5;$=z$qt{b-6+AfhW{DX^`9@KyZPT`Z#A4zM%1BQm+&a9FiV z?A60bnO8-XdkH2xJ2#^~2tqi{d?x-2qbR-?@t1CgsAg2eq)gpHREvg=D23l);6|)SandKz z77;+Cz^KZW-jyxml!TBZgrQ?tpSx{+1V^ITS4wXZp&VG z?#jhC@?(KjJkOQkpw=x*ol~(eEt@8130OLSV`>tFp+}V?Y=$&1q{Z;Su&tCmh`IX1 z=<^>uEJYLGL68~l&e%T)#9dscv+Q$+vIDamG8Gim5Ryyp=l0A`uGekpN7XX!6i9gD zJeY8Ja$^+&@Rj%x(ivg2Ee2(4XI-pq{JQ(^Z}YA9saxybtCdoA)8B8o?)9$qGx?W` z&lLB2=OpTW+?DcsoK}k0a~&1exy%)}s^=`3+McHF-!rbYFUMH^Kbvz5WYJvvdZ;xt_?9a2t+T3r4=J6m;hg;yr(UpX^ltWL^VPg;D_js zONta4f~gcJ^hAoR%z_nu5Um=aQENv-JV1Tndo}UA?+$C0Yg_MR*e$o^IE=(=eBJA* z+;^_!S8=GQ3l(Y{fhnr$>Iy`=lGIVuM`&9~z*`P9kQt#p(R+9|e}hnXM&hN| z%ECn-7)16CDj$ORCg^dzDk@WDB7#}-p&qt`+elGlCf** z86v4yD=Wgo1PL4C@dYSo27;G{*iu(h7LIBl`!RS|R$N7>3KhnRB#oq^4+UZ0YCDO4-$ezs9wW2C;oK18zQ%K}Opju5%RnG%SGe*qIz?> zpSbN2A1#za1RV{i;tkw55fUhh6DX2yeyi2<2J+*)-&$h6ijuNMa*R<&eoo4vo}CO) zhDNYQ1WYD$FO}+R;_?E?lfru!f;6DMfuhE8iY()fHC^MOK%onq z&}z$%WSD^pc!pj~65>Z`#|A#Asw%q8^Jhn8l5^Y>hz}wq4|qNfJvdZGBF{-Ir~@PD z!Sp*PsQd!JZ25V% z4H8ULS~QUYk)JpAiX`yw5~7kx1<)ZtJuRx+JjXlkdGRshl^aTjDpe&qb0V6)tJFLj z79Hfu-{YWD9dmp&z{SlI!S-xTEu1y0x2tk+l$4gnB8e9fM-o@yw?2#Nj+%<~rl}Zm zz8;uaZW1+zWY$4hmPe`@#k3d#@!wWe>RfMP=YSoHY-xj-l$qrp{B6wrGNlm>cLUx)q4% zKG~st6!yapP-;%55=iJ>Be7o0XptLGSKl~>v+1F)ITHlg&$VQa#dJu%HC0iPy^!Z| z!cMwKU%0rd@g%dzmMMZUd=_5O{T@d`;t0UdBbE$YRM7xM?HqPAxcn6mHYS4a9D65Vi_3 zXW*dFaDOafixAL8nmi|JJF@mtQ|gKouu-2o9EsB4K^y{W8J=Y6HPa%|hMjXQyEf8* zlFuL7jYP*01foGkiH2l85_qCv9Ag9u67d7v=orTIdPqvR^R+=Ic75J^@)o>u9|>qI zP$3~jqor|h{ldtV8ca*;Bh{jgi8G>vN-YEL<<5?qQt{4)ZESJYQm3E z$E>JqOiDL`d!fSmYjqkeB@PMsAw->hDj=vvC=taMBh4-4QDZuWW=}^8Fev0TA=sm3 z7*`2)F`8ziW`jd9vWuxSA(ofXl24jtN<8SeIzsz3^W^C7VV-NvV)Yx30ul$ekA?eC z(7q^l)qFLVo|D<@t8vpj1m=w8J#l6&qT5OBx+hfws*$?y=BCAn=L(ql$t=wXQBZVh zfTWZGja6E&9f>k1E zxN>YV3RXka3`C3W#uBTmXL)kDDccWO1fx)?&IB|_FhC(FnT&?&C#u3nb%^0)6=dB2 zaSP-rP!tqH4K!3iQ3V856BNNrLrFtTR74QX1XNX2OieOH1hGU(B{ahg6AVmMT8`s} zXqXr(gVbOqA*Lyyp+_rR^y|gn&vUxw-@{#R+46pizY%>lVeI<*N`xd?zV+wdI zr_EnCvxnYnC|-=jYwwmW$-hlu@b@+6hr_v!=!dHN;i@dcMF}Ha+aHF(Pe$nqJzZ(-(6gLkbPZO-#1Y= zU95PQtJ$9KYwmAQ|v*FxHgVxs@kCPAOygTgSd43-|`QGZymo|C6Uxd5Xde5f|`N1zY z<;wPczHi-a=Yr=&Xy-;Td)K+{ z`S;BodK6$^(xhhgyE@P;>aF4Ab;K2Us!Gn zMxtS2Bfvqkd;;X?>YOZHE& zu<-I@QGLnjx7t4N-^EeFMj=IY2tEi$aj5GA9*4Z6(7dr(X1*W zsuHRlQ*zo&;$=y38j`kxuX9U!7&Y~m;G(=u^=c8a(b>`Ie?Bd3B?$H`d&{aSX+;R* zYqdC7ee9Ei%@}X1J2p>dk1-1es78ixp01|-WOu#U^Rnp`d^);HIyEz>e-)+lZU!bX z;log673k^=(5f{gGO2Z}P%aW|(2PA8#pr-=B958a^q{0`zREWtxTQkfo@}Dmh)JT; z5oGrWnBSiKqV{5P=3EQP^QYnpwo&e-ec`g{m|-C^*Tj2f_>C7L)w!?b=^Wi zHS}#qr$+a+jv2F3F5H*eWwv=K=cfz}nbZktIyqvBFq^IjiariLh{HqSCPFmBoYf^m z^x1Gw#iPB=vnvYPc}?r*%B8IlAg3(&d?>@4JU$igS?V_yA$g%;>MqeJf{mSg=ITr~ zilEoZwMxl8d(jqF#Ktd)A;PNOJ4KSW^>$6-W*(C%2?+PhBwd&E@@%noIFfLe2o=;# zBp0FLO||eq^^iW%UYkyIQwb*`bUQ_;X*h6DQ60Yy+2t6fv=3s98yVn@=w@iHmh47$ zqDnZKy$octZ7txnlVzSGSKQaSw;~m zp+qEAw&4tIS;4|FI7$*RZUq>UxRjJPXJtW_BO)$)3W11FO@wI%;K2y74B_OSJSfAK zD>{OYn9C4?i0njE6jO5^_cJeoB*O%dp&fXt4{aT-!j4^=8fkM53)+`qvMXbof5?vO}4ATq@EEpzXVzSgw`}0HjvvsX* zZoF<%%9+92aqo8~ywRm9rWle+1RzO~bQ#ajH!C%Hs-F%ePR8Z7qz3Sdhk$m{8o7OHd+j1q}FM7d$2wEE3a< zEGe;~q@lnQ<(H!e8xfY7V-S%iI(9+9Awi2A)pVy#6sFRuBru?wv1Vc=8W+JyvbRJ@ zhf5R}P|4)S-3+Z}y{El)uJdDSVu|KKFeq0MN)8+*g2P5ZR8-H~(2k5UF=#@oiuK(_txqO zMu{tRI(su>FU$L~j>|gEj#4bBlr(j}WkoiJES1F~fd~}P#5nNt!?cSehQ-mil5{IpYSgP3pxua~iYTzc*KyJIR0hKjv7@oHaMzu__4lha^Q=DP z7Kss)B99NJe}2uq2EMY=5RAjj(&!OJ5+xgbQCxKhMjdWLBuYo}Nc7lwT)p?%s)rpN zV7;OEBqheUFP=I&>_?LrQQ0BY%#u*d`E?xm)mfwJfDIxVA)*M2Q4tM7>z?YQ%pi#a zvbAiQ%qfq3$I#x62KIAuct&07451SpF&-o0IAegCai}*GNg{*b!emIqPNZ;bmTiPhoFJ{Z4}qYP6dX_F8gqf}`dgsItb4A3({9ilpezQ&=O-kHBF+1WRT zdKuxONj0<1>04&TB_Bq8G}2v;<4t`k`>f##Ec+8tUuA>_tJkwxrqrIuZURaiQPe6q z*_&T8(=<;yJ7%Hv($KtK$)PGRa$Y2LLXQr3YA-^KGDX!Rm#)sV&QDdU)APR63OloO zZb9g=#a+j>ptPgo5Em*thj#jOSYTn#o05AyIBfao<2THR#k@IqTAIIH`Cld+YGgK6 z5=FCeph!whwR2@rF*aWaZp7oVaMPqdbKME{>OLGsjr>NR!=j*PwC(jrJolSA)=c!{ zfi0ueSo`Vk+3Nvl&2=2mg@y?9*3W*#%^qJyu<>e6VWZZ1S*SZb?g>dj=x{96lqmWm z3qA|WzPde_`QDBE`E`L`C(m`$`CPg2mUMBZY{g`ohtRzEcjQ!NjhuSzkAoV65rd2r zL85*WVvVr~_Du+wJWz!YY*C|I_4OWH{P}B~joaS!DBl>3#SjBsEj?S$xmLt9x;98% z#qW=Onm*aYZ)Qp~h1tC>9-VY-*+l60S*n5zQMD49uPxYfxX4I|mDwkyg%o@qB%&im zn)qqwy}^y`evcADQ?9kyHyEJ4N{nkIj`i>q5qOpWE&?-`+p*oGp?#rqsQ;J58E)rLw zaSalV`x!FfSow@<{_w-IaC`E+7a&%A!pcPrEgsCH?(9asnJ7m7E%gb?`gTvZ9rBHK zb@Y9T3ZvvGS$eLyRjlcZ-$w$+rSgJ(eC-uJKBN-(zL@j4+?$!8-JCl2x+`B2Qwc@z z>Q01|Z-=%dQSe>~Ahbh-ds{m7*p=Ih`(ltfAs>5h$=BJJ*WW5`r4zK=N1~q7tI(vO zA49H*BLn9bYJIB$7=ZcE;5aX+BjAh_NEDMSLQz8ypE5n+lsa=S+Gxiy!WD62!Yp*gHk|{9rSt1j`TOD(lr`P=i>fqA*@pW11z=R$-Bd+4GNs6jMOkxv5l1BdMV!Xe~{N#K9_NsA_j5 zqpaR{5gm1Xy}ms87+eJ8qQx=q*5Vu4j2=MtPC9XNW1e}RERvDCi$vQd5L2qlf|QCK zq=^X>lU2)iyc}?H^h<`z*u#m8W1c=RQzY0F84E4O9bNm^vmQW^I|+KotYf^R_O?{r3JPg zqJ(v^!ij|1LzE>V6{AY%x6rvIegEYxS_UyJUvW{S-f);yBN)B`{DpsF}e@xd6 zx1_5{10&64L)fZ&2o`iUK2S%59sOzsC6^M@SZ-O{j*JivIVl+z` zz|xIbBl<2PR**=J%Ng_Ij}%#s4XT70(EjRsrcarr=a?aOiM?N9@$#>E%AKw0&o$4L zhqWeP&dnBlM|Y+0VIyBGT>?WGm9DkgT^hq?$A;0uPltEu?+n~}p!emT9VF!I;mXjX z&7BD^1^3^Ajs^B;*2@=0V30kSN7H?r3P-KSN5=87KFwAh4}=C*B~ zZ0}`8xNkh7{XO|Ho*R#+4+Kfz$voMkp>`eH_K=Bqi@9lm{?=a+fpJx^KpJ?B;5hkqpR!p3$up5~m;^{q?yg{l;2)o!{M z&kqtgvR;nO0J<>r`4V@l7MeA=C9Z{zjumx-upKk+MVA@ z#>u`bn96<&U(RK9SgPQs5%$<68z4_ty zhYUU)pH9z)cXP?T@8148%tWe}-oCf2J>kEmjTCba1*P>;_%8R^sP;9B-XZ*bmUHPh z>G0w2&qe2-N;mfR+4H4mXGcC5bAMrcUv0Q_{1@huO6m*1e(Pmoj!NHQwUy5{ebZ(WgE^1x-MPcxn4Aheh!$+{%R8f`CyXdn@ zFq56HW_%ex2j7Vr?>n7diR%bRvm{c}-_MGR zIIzX?Lbus57MDB6-$C$3lopSN38KD~_waBn;V^5t^rM9yQQ4X@kcrv!+R{oiE79}o zDvpi&@3A@T$A+ive373Je4itpJJ^}nkgVL4h@zc!;q0@bj5c#=)`x<=4oP7m5wE9b z+cvxHbRTvhNY2bRyfXLEub8{p>3EI(JS6zsYp=6q_L>wWEJ-xMAvJ86QqCYHQ1Oa! z8+6C3G4DM(e4ac5(_=ph4XQ`fT3(bhD&~)^CV2Ft=hD=pvUrgKL{fy?YGn4QF5Jw? zYlzBPGK&|dM_rk}Ic5B!PSMZ1 z@6~6I)#s<48j4+YuDm`UE5DJ2c$$QvsDY>CFsS&?Y8R3o*1M?ZA`=wtN;E+(32OmNakGzBqz_8Ov#)(rXG;8N;TNu}^?tB;<@pjqU!d>JFBlz( zrPQ6#L&hH2xn}yojm>q|SwC8M&iIv7csQJ#QmT;017dEN<$#6`EqI~F#B>-j7-=&K zINVQGd1q&X=;sc_9YJjx)Nku0CAx$cH7G9W`@ze$P^dhIleuC=#Yc77YUWkn56nyF zto)@VDm@=XIwzAV6m*7`p8OFtP)XC6(f8Iq_SVVQ+4nrB?sdNkonKyfSxd#c9iuw? z(kS`9<`)J?hfW_-UxJB*XmoY-lu4t@u_$Jl@=vFwg~+3vKAjcmmLDXud^cU25i+z- zBh(aZejxUej*2?Z4?Y|%9oh0)XU1>lBCDIYQXIoEw~@O<;swvpQxluermnM&_vY(2M(X;*L_097dcV9aBuUCu1-F3dJ z+$>!<>+jj_K8W>Mz9nbAA!|DCqtzPBRa`_VnU%%jJ4ASZNJvN`-tet@Owwiio9nu$ z-^cR)PcD2_(4*a>qvrQ>n#Og|GWI4NXT5f9A0o4_iwgN7sm+~eC3c}SqsXFy2|j*s zo*hjD%qMR1@hJH2g19mfCjRsW)OFPDQ|VgOIX;qww4r(Oz&g)Zi2|{Zh3yEpeNE?sgFG}jH9Pyr_vR?Pe41jhiPevDH=v_7ekI38H`0elI23Wx z79E}vhQ5_JhRo*g&r^2ovfh0(Jl0Ej0M+Px%(agH_x#^%zFfz&_wo_eeFsP+9){(s z9$03_>BX4lK6BYJ^N=~|M@|Q{fq?^;Ud@fQx$G1?Zu#d=UP1}8y(p$qMI$BWBhQFs|I~*q1OJR?D=5K-yws8 zVa@8-pJy&|^G6@wU#>Rq^#7zSzT(f!xtdKUNN$Yf z^bzFYZ&ouIH^iP4lF{7d@8SO5T)8dGVe0y^g|1$|B#HRBu%x#gMaLkaHj9r@)LrGr z8*YB6>FCjs+LytmLDAWF%7-6lP*oBV7qh!bcY1pMZrRB{OhhxjJ=h6CL6UabY~=16 zyRhn+?QXNQL|R)SHX(IIB0`i+j`#1VolMrEu<%-Rp2T3$dSwlkzGJ(WPTiI4xwsog zxTa>!JoIUnJ=)Oyner$W*e*61@3$XuvRw4pi(Fd|nt8`Xsfe|FjTu2PU26g0BrAmwJIsGT+GQ(rfOc{T|j!eR3#1k?J!*%4u++nNV*nW5x zVZLxh*f*yC4V*Y^)_82!_jX`9=%QSbC(mET`kYi3~~+4vop!);mV0$dFa$C zaXMVBHmz~_SoWVzH=V(g5!H15-UFJ*t8)jcIW&aAId7Dt zhRK(Vx6(^K4BY1X&mDFU77npCoi1X0F+6x(uw2j$3A2CIgEm084Mf4i){%KU`z~&H15HZ|uS8 z*+(IWjBuPCo*7LEGD(O#L>EEPvt-8Q>?ze*l$PRL;?AF-n%=RP?83UYe++ugXyS(@tX*_G;8;vqmk-aplLe7MCu{oQ^ zXDyWl++BgxD$$t;!Yi7Mhiu@uT zHLV^$38a+06+KqD=0R#!;|&*csO93SbCXl0s<%&D-EJ9Ll~p9U+}|>dtDB8lW6o-o z&Q$A*Svk#Rl(~H3<|a4JYfG1SE#8&P?l9Kw<<)LU)pJz1+|L_Yr#Z1^mlX3;wHsGb zs;wH{BW3NJu0347DRVBi@aH!7$B5SXGmQ&-oaZr%9nUwC4RBMs#H#7NrL3FUSEA-` zSGT@yN6mAKnNs-HY;Lbs_O-5SF>+%_+8~2rC^(3OAl|NcZysv07~6oMrD&IxOLFF+O9$2uPNZ)}-3_siSPe)nc%=}FStw6~op>0->&s@}7Iv**9R>iWK~ z9dYCHu}xG&lvGqx750aL{xv~SKf?kc|1knUTsjeosEVAzu^;ZA*2zYU8KXd+6)R6tef#k%4>{&Vjk2VI13*8`OqJCIk z>XiA({$}|W4+tNa1MVo&q58%Aa(v~Pg?*<4519H)2lM;*BdNl~{hd2j+(|dzhbJ>D zQYMg*`&*?0SGye!QbPJj zNQ@AN=7x|7oFz}G@-%RWkRmCdq&A8;WNk?C?lf&+K;XY1BM}mA2f1xy! z2^vg|cK){!Y+B(bLCKzuBJ5~o=DWevdT>+4eA+0V*_hl3Cr@Tfqte9j5{;@nX*>?~ z9IPiQWTYyXpe7PZV5FudWS~jZA)blF(a`3&3PNxPgnm8`s%fT_QtX?$m=+AsL=y*n zd`hC?8|1)`#84)*qgaTkDOVVc4I~o+7?8v)o8KdTSLo%sV2X)f$r|X;TnpaZN{iE& zmgUAw97pa{tzye_A5I~^axo{Ta|fYG(D35rp0BU4Nz6$$KE7qL52I`7$;9|ZCx>1) zjh&WSaq@JT08r6Y1KRf(Bj4?lu;|dVlu(HjNj}v%90co_^CgiS`$wT(#v$SsJim|A z8j>j5Mh}*lN@fpPVJFYAs`#D}>qCb(v_sb=G~n&H8?u@p-UD0m6vZY&r#&0E&ZtSMd|gA_K_ z1R)@FUJN0*IRx0KLpPiD-s3mZ_OSo)9oTQPd6}{LJ&zBVKo3xUFY?3Towy*W&r2w>^!?$gLYmpFk|xT=UIA61tVD6fv=BT^;|-L3@6;bdF;7Pf0o&0 zCBiPtWEU#dj|rJpK5w1pJbFn#!*wa!dzD`=ghe0fo9vtH`BqoF%%vHlD84eIo>hkL z*MFCOOJDTmUVp*E(A|7zW&Uq!SEGpgT-*sn6d`Bl`9!Jm_w1g@wdX~)M$H~nv=0g* zTs^S9m!id2!E@t;{;Ok7Tzjsy+THafw`D(Ol(>{aWZaiUo%N=#UB~gAUGpbu(+gh& zlC6IzXQ5JY5|ZnB#qnL3?~31UPoCdJ_}4eeqs_Km{hm&JD>gU$q7pKNACkkW*r|E^ z)`XCRO*z6fwuI>RU((yY>c*)$!)&@{Uu*T2eKU;ib-yf-npcGcSV zR*T`w-N%Q7Ivq{pD;(5y%3aw?-)#8gU5|C0+~F$3<178zN~*Vz^4RlG=09{5o2#}` z?6+2>_e2qtRyrr+)cYv;@xm`bL~dP+wr_SyBdPjjBVJFvNm!>eE?Hc!{BQ zMhRUiCr@Z-AMKp8nMBpWYKlv>ek;c}<9%Tus?8T9rtIo^#@Oq4YOfU2!*noSy;wOE zcD_$umxbP#>g{uzTYB*3zIBrBOwA;dCAo0b^+r6rUN5WH2hxtrX^XRML$5Ti3$M0n zMF-syF7UB&d-YD`d_1X3yVTUDO^#`O_V;b^(#yvloaDA$*}rxVo%rmF;;oji%%u^s zL5=WGQd%H%MbAiZo4-!?uj1~5bG(Ecls!)vlX-ZT6eUud^Km0(N2Pn;u^Tr(D(>I7 ziShFNJ9}qs!qI8GpRDDSZp&Ackm#2Ok$Mf>q(N0XNQg%;@1(n{-#RN+)R{L-TYNzk zak~{{wpyJYXs$@*(~Lrxsf44UL5rLY*CIuiJ@X-d$5@Fve-5{m(&b4`e?y&UM^yS( zDY0e3MetKmWs69lQQ>*`d@zw(ymWGinTJH1A=9*xG&{MBGsCS zt>#P0a^)i2{{3*oo){TV$r8VhtJ6AmRxiilgylHd5L2&zl6InfZ=~eDJ1~aC^egLV z@^gA`@Ywy8x?Om_8Ed7E`?aM{3#**FI_Hu-pAe9+_%E`m!pX&Z-XljUoCvkq18{4W3GI;r(h<%^xYhLrLk`XqlO zKh=Dvw}G+qKkn369DK)Kx*X0fd_K2zv2Ly(UgPfh+vfCn1?4ILIFQWJUg$vt|Bulh zLsGVtVzn*#M5h-krCY9?+FYbJ#Z`8$ZndsHW>+DIEdn9|z@grX^WQ;ygnW>6u8?#; z5y%IS+s-QK7Un_Hq)L>jV8{Xv2fn!cyfPQshqmo>QUGH>oWH80o+?kH0$U1b5`ifa z@K6gRF(6b!Qi80DnRvuBs6c_0Vg?Nw1puZ+UNEj8Xn~YQSr#EBlm;P&VI~2Dm{_|o z91qYpnB;rDKWxfaa`lnwid8v+wf$XfBE?{*;+ zoa-ko6dweBpV2zoR=jUX?E`tK1PAR1YYbA1KefWG^4E9F{;TE7x5vkoIjzdhJdd7S zyDn6_4=!`A7h$aKo%z-9%MBJ;&n+#CTU;-?c^KzN!A|^jh*@8C9buMFez#8|y4{V8 zY-w!svZXDi7wb(9jU8-yY{GgM?9)3K*x7BHEU8Ou!u^!e-zsGpTKq1@7o6)%m7`u| z_ZvfxIl~q*MZ~uAG4Q*uVFV5jPLS9pe3KR$8&b`%IiwW8%R}q5uL%wPO{i-OQIX9) zeB! zyBT9TtY0#%T1#1JEtQM4rL~qtZd3M*-NpO%cW(r9g@y= z*|Q65u2wb_gg};hMiYABjPiW%GtX678mtxgoS!RgdA{yAR&TQXljC`4*85}4eIpKv z--2uztAb;+Idon&f^9>8TLw2BMT_qw~ zz{hM}*62OrJ-|5p++Qy|u7?<0c*hPV$2{j4A3bGwT!A^}?0O-I=E_f=bEFl#~f^17E*we-rwDf$?vc)PGm*bA3vGS7$T++l+rKhkutCIn#|NM4Aq* z0*aBsjTG?9m}sR@VY5sUBEwiHOG%j0W`^Jvjv?&t&&RHBPXocn$sCG^Am?9`&QBc# zb@C=l;~_>)7Hi*LM-#RPl)7{=N$^+R;XPBJ$?wc~aXf++!*vx7u-1aeLWon2#)u{nA|$F& zXj1^k6jF*wax^kTS%gfaM)ftWGj3I*j10O+789X2Ix`vCg_H!QpIG!joQR# z2)uCFY}}EQ<50;ZmL#-l2?(?iNFY`U$wHQ}#2D&vd`W`V+LI2HVi2fzE)-ITqF_XY z$PG~3PVS9y?W72(#S1{>qH>Z*xR{0vX2{UZ(Qep8tZyCb9e`BlUgM)t!7RAu>C>en6XSTm z2q7X-1s3KVs*0Z$1*$P2HZVn9BL%Ej>}QOuLh(Ix@FMGo9+#5hG!o(OFh?&vR$c0} zlPAEz_bDP)=$#4zU!8FG(D^wE92A5th+-xatg1+M;Ij&Ex{q0hB^l?fKrV`qAD#%5=&@?JsaRjw=-d} zvsm(qqhO8Ek&q;ch^1LdAmVK$1B?Vt?}Af+(rv~KhC?O>)F(2MmjY(aad48%h)GX> z>6xzMjw&Q`D2Pd-EX+cZBs2FuC_j?LG>%}m>|fg3KbP@7;=j(|`%imvksc1QUgyj+8M$4#ANl+n}4?l zPPxGdvyR-Q0M2{wxy<0L zD4+VuY#WjU5=cMLB$32EnIfA1U0RCrU8CD=jqOK;3wIs^Bh^Cd(RGU*OtYr;a z5pb=$lBug|q^fr2EnBdcZc{|vO*atFYADGm!=KOsNE`cWM9rEpqILH0=ih3h?Hf`| zL8f3Lb)=AVSw+n*Oe`Rh>k5mjE|O%*@c*c?KDnA>XtEs)T!U2^G95oG=k3cmjx@QP zDtjjIAtLu@`$w!IP8F8lV0`U44U#$_wTXC_I8OH+azpXocmC;bl;}q^pl0J&V}Be} zC;&ZID9JS~8s*bQwcD@$`H>tfD=LCeoAS(2BICLgTlp?LL0|b?IY819LV2f3BS_S< zKf_c}M=FX11fXe4H+F_Y{IuFFx>1j26z0X~y8P0aCmqK_+=?X$2u5r9@Yj1YX|o%B zOP|rAq`s|_*ZsX+kAuQ-=^dGp)a`37_cdl+EA8_OX7g^|^ApjWHPzw0?CYvG%iUi` zI=+^0-#8l=9iUgXOx8JCds321hE>|l){Q90K+x4uI^NQ_skmn+k4m?vvX-|hDfOw^ z)O7yW7S}A=iEne#B&{-K%;ufeLee#(B57qub$$1`&CfV;s!)^_#M_gVC)gE@!K% zYIN-!dyvp+wNS;psmrNyacZ8qSz_NFt)G;l5TJrRK*WAAzZ|G)qnJnHMC70tg-S?) zN<_&_g;W$&DHO)~)PEC_;inY_)>V~KDvH{^DH;L|B0KyZzBPvi zBC1$?KNM1{WXmron(n5g&%ipQ)KIAF1vT!B&Do6aX+}Oy$3AZ3KVn*bAHmD+1KHCm zdJ-0lSjkS>^|hBlrGrZ5`s(&;z7~BD2at(~#xzVmb0@NU68(D8=S7}Vv7tDK;((01 zhI<(j)x%RGI3SO(EudO<)|F&vWQU2hh1yTCR77Z9t=tMQo`W!+2?8>SG@wAB{0x#c*pCW3AmMiyO<&>lLWOZ>M-d8f zkB}Bc;(=+!oJkQI>$G-vczrq!`;NR8jRiqfi6xQbR5pdK;Sscc1VEtxB?%_g82LSB z=j3WOe2DPKT!Mn?O%i)adl(c?q=w251S2?!;LJ8`92ST@4a^cGC|e^?;#SOv=)D|_ zEomryj5aR|=-_ABW&qiG<-m#b%^TBi4owBz7g1Y_X#l}0)z-H8r{dGqQ_=hD6}*qBSgq3fU-UXn?Cam7Cwgf zbKcU>B`d<#ZK&GH_Dxoi;_FTEM!jJ0>$6sbkc^lVu)>KERGdJOa{~z^q_$W|)nbyR z%X1y5JyucKjBXh|B+B-W9B`-Ki1FePvGwRAlW2L^vxe&n8jlF`?@~%b8DBt5l?e$Y z5RilsR^*z7JxUiOsJI;xc2g8&TsZIR3HulhL<%JYsDzJtP=@+F3Nnb+Y16ZnQ>%s{ z%8=ET&h}2#y)$o~Uc&_UZbj!!37e3;25~3B^TO*nVtUw4Zk38RrO6h;l=N6mvb_p{ zqjETQmN6$Ye$KP7hago=#6)^~(Iil!+fK3YtF=VSK$%v&Gb=Aw)?KP4q2&@Yha$+1 zD727car7lOgy?qQXpnlCVb(dqnG_i-l7aFP;yKKM{A?2o^^ZNAJ#mTWgP_=NlX+di=8tC z))xkf%IG$9M#&BgvN^$p6&6c2O~Nlm$;4qLn}8;U86B%aG;3QjVlg%G$lN}D<#~&V z^qwK--Up)tGJzvPD3sgkE}$<9)`;xc+;dYKVTWEEH*SY~3CNY=arq5jM8yaw8dZ zeeZ{58aDGBYmOpGB;u_jq=RTougWODfgu0nXgXwMsM;YMIk;CC8 zKwhNwW1kS4r=1QWN3*^>>+ILT(WZ7->}7|}8pa|=7+f3-G!k}o8bO=~8Zh)_2U_LF zHZ3hrK*z;%6BcV$;>n4zW9xxtRc2ldH6GU%#3R#%Sc>4ZIM+U2(wpm!)m{@3(5z6( z`-dcK*2Qx7O~&`KV+sl(K|x2;MdFnt>AS;5BE<&_JtStl5%lK0Dtn{2`Rn)|_8V%BE3w**B5Z8R43Z1-OXZwpX(FyIPvkr^1q| znDpU2o}Fmk4BpPBC6;oyoIMnK9h?=RLXDMrHZVsHK`6MM_;DONlS`N2`rwdIg?S^1 zb1WqV0}idYE9b+rQCEEuP>PLi6OEJcLg=tcv`e_xesv>~WSP`y(i_zaSJU8>8p=Nr zX1w1*$?KyVF3z@?jm%F%Fz$t=H3bS%1K}tKI1Lj71u>7OCO#859 zksf>v8?rtlUYfrKfb8mqpb|m@&Cf^|JCA-SA)*?FC@el2(>32l106#fW^{M4{9^Rc z=>3q!Z>fvmPoIICJso@~@WbF})K^1@M8{N6$vi$C_EADEJ@XG(yNe9#rNISJ6Tq%5 z1(S>0G8PQcc&MXqWw_J^i9Ylc9|avnq#*i)qD8~8O3Yf@9Q;alAjr_|VXHeZj{G;W zjQGhUnTIX{3`ANYRiuQQhG-OcDZHUd-?tu`DF%c=xPBAr5QCke4D40ckz(bR8W1!csL{j45zyo~SMCpYuHDxc9SZPBaGVHu zdo*QaYi7NoO`0p0W#mv%g04QAiAc$S%@wF7jX92shP98ulN}F4fx?NJkwCPeoo%W- z;q;CX=;Tf@9h2a+QA0%_ZLxSJLEv*_lpqvon%P-JBV`PfQY}Q~69hL75P=||K_Zk! z|n7uh}uLqH}t(AaS86wszG(@F%hVD8(Gs5?VK5K07yq$Ct+ZeX<* z(mf=2mtvTn5FQ>L&$m>on+8b5lNmHp5?F|Z0|tmn7`zpt&T>xf<`#J6Bqu&l>Bq%f zOJ>oc;3Mk#DBzNXg^8%rpj3Xb*U2<(7GyrCdYFLs8h%c|M$`qywHhu(f}>h^QD0xu z&F4Mo3OcHejX`uMX(CPzJvoOyQFTqWRaepFn%|v5L;2^=c^*eSz9`q<8Z>_*E*m-BjypSLjmH)KHUK4S!@D*1^MK#|wl7)bC;P5m z6xB6VM|;nSB5a2##3dwx0GW^=W$?w2s|Ape`tcGcPdn1Tf3K$gz2^&Ry$!^shN2*< zDXIplqCn*WI)C?w`uJYWoi{Ajj=H%z;kIP+*YUK?4*8#dr#p?8JV_w`W|)KtI&<5{ zUrF#f#731OB{}qSsp9(Cy0$!TB7|6mab{bNc-(mBdK2J~DXNFH>nFsZtDm4_#6jmO zAk6@yv4O-WDVbO|IH)*ewDBU<_9M16woGcXn~5zQIMme^L(xlQkdI0vo2#CbQ%nG6K64J9!t2(X-siskrU&zTWycldHg-z5E>rykur zTUWcJkzQdNHVsrk4(~okEc5x04xIKq{rC=%I|fN)VU;4qNG*_}FT0>Tv(w{!{btr{ zE)gRdyE=9vf5{Q-4#MHEFMerJ+a!FXh@RX&dx7mBckEwI=LlO6wgM3-5XdwjlL&rk z!pQ3=oCOE3S>w1TB~K@`*9f?7gULbh?%=N|JA1inm;xc+->b_32eNwC%vC&7;hKr_u_mK4(R@By&RBsDXb83;)U2oRGYGPJX#nVP^cOxb~e zu2|O%Yyi;AVVj-3djN)Ds*;MS8?$ch3iReE91c806ni=F?|XZ>f)8he4@;}rQ&iA2 zp+OQ*4Gh6RQUxe?EohUFoA16o1QF}szh`7boH^^)USz{M^&U`AEI_nS(8Lrp(nh`0 zjmUP8oHz)R$D_ZuM?^wvuS{nmVTVo}(t#!#p`~eBXd);Gkg8%rl%b)CYN!Lkkgb0o z#Ys$HFU2xrl*WRQGgU5J)F&z?EkY4RCKF7ja>Z23W~7o~mvWPwwos~BHtyU_Fsq7| z)ytO^MJXT)mQAZlVk&BFRJdv#%)+^)b!924a@fMuQZCaQa3KOMI8$>BZIt69KN${5 z!d0LWBWkj(CY2&eRU)KA^!@ma1Fhpjq~9N?@D0V<6Or$=sG?s-raC#ll7H%oY@x)y zrcxL_imk3Vqr7&>S$ABw0C?LW&oS3p%I zQ0SS(g{Tw^h@^z=nh6nE&MR#oC2JOzw3H&!g%k+vV^oHbG=j7xXizj1v>H;h29Tgi zpwcebT_IXWL#jhcQ%O`QqM8Fv30+W3s2fR|013v^wvbSekdr793T-5Um=v8LE*DIi zXDBL&g+R59VnCqMIw?vDQi`N0#O;c-;3Sm=0#s2&3=^bKW{?z7MzZB3(qeEFl+xCy zDWuSpQ$ejzE1=efl7T9Lq@zPXP);WklxE8yDIquoYE%~43Svakt5kubO|wSSg3gB+ zkR&vQ4YZp|$ZJcW8eJ_9;z_&vkB+uNLU4i#AJAF6&xOeU zmJG0u%|r7p*rKT?4F*uksxDDQRgfr&7;2~uQA45DmbIZ8ttv=m#I7?!u^K`_r4%xi zN>gkW!=*G7ngWpu0G%|z5(_Ezoj3_x zO63;{yD2k_s;eTHkf>?U=+UP@QtF*829mV1CJ8p213(LfFwjhbkwzJmU4=B@ou!f& zD&S?%fkg|U+RDUeX*3j4G-{HxA)yTg0i{Dmnp|l#h8ogIra;OHE*D9p*>EUSPF%8S z1==V$%7Ly;P%Si2g%wmF=mLeID58L%DccT|G>dGM&}lWH)w0%#Sdh@R!&+$_285+G zqZza3#1BKtpQpJ0+g+EfK4S7ics=#B94$63R*zhDVB8M zpk0Mo#am)PCU#Rnq%i@emq2N86om>zsH#o{kS8cEou-;qtT6Kb%>&wlvJE2WXlblY zs4*%MNTD+($^zA@+Y+vTrjRHNB_&lN27%H#0n!?2jesakR)(}K38fs`qeyAfrF2lC zN{d0Q27soLh0+ZG&?OX-Y*mRgf`+KlU=%Tw#;piw14uCnP}Yh{Mun9cTuC}Wl>$U@ zlrrrgY1Wp7(z3npM+m06MJ>ohzzPpel+@P|#?qT?4i$D?sUVr66d~B@VSh(@99v zq0xv6)~ErZw4xeaX+uKkG_*{_jVS7Yq|kwpf!cWs4fMP zNz%BL00{t76SCcH$Z`t^3IUa@BPO=zNp0wEVb7?Vq(28M@PLX^=;2AWch zIw-`NO%8SqJ2E;7h$xW6nM^LgQt1T^J7SerNa;#fMv&0cLK*82n8S%8lljLGyy}Z9V!$$ z6bDEJY0y=sa#6%4gwa|+C<8?rMN>)|O;uD# zoBa4x4a|;(LXgv-bPJ|;f28T)^r4Z05p$!8_8bGB@ zEeeUPDxpZLs%RYzHA*z7lxPY7(gi5#MAntI14@j^lwB$dfz&{gF#dzNE)Hi6;z>32Awo1KsrZ2L?t3n8l|l$ z=m$eohS(n@hg7PNsEjIU!hs;NfkUMzHLWxzl^07uQt1m|qzV#-kqrRSA)`et2|-4H z(wa>=K+=Y^DpKhU2|#FR3IdP^K!-LIp`f`V#mO(U%ijWntyX$4wBf|i3$3C03IhZ&-+BFU9ZWCKbd6abnOX-0rFDWq+v zr%tFfNm|iB3rcCCkkSF5r2|USrkqKtP@zW>x>k@)0TOFKfk;vf4k0uGQU$V;14?KT zl9HByT_LK_u8N^3($<=wDNvvdBTWShpwcvfwse{uC}?Q{gwmQrO*9EbD`LRJ1E6%$ z=un|Fg(iT|x*EhThgA?;DNCiQX{0ooT~ZK=6=}jI%P`||V(;*F+hReWS`g%-P$57g ztpaE$8gyv{&=jJYP&)`A%aRlYA#90C0YW0u+aNTHL8>(3(VdPXFj9d*p;XYi1f>%~P^q9a zB?y~sQA}FI>V=`uXc`R*q#6OGwg!Z0rCQJlpm8)BN&!F~wgN>ll*r&Zssc=+hM5er zGDxx#NNEYcx6 za%s^>X*9Y@Xto3>9SNY&P#PK$p&ck1O*EmlKn*KEQfQz>rKwPvCPAq-3Bu(RS;`m# zpUQtq@E50=g$e?wG=`#3D0Bg!G&%s%sYsh;G$0bz1|v>TP$V!5iNUc{XbKRjL^Yvw z0i+!RphALxDNx$lR)nU2q|-r0mr69NKop}?EJn1opfx}m4Jk^I2iSxTT#+=cgII?` zM4-|wGzB1Ntr}8*bPlQ^XrMztw1$-^3TXnhqKzXPE|4Mp~&~1>?27^etpfrg|q%@VFDRhBIfT6$Mc97*!*wRi3SyjME zIizv6!s8RANx;z{N`(bdTP`4=Gc@Rk&^18lSgMkcDBA{*(rM7?3aUY;MjH6U2C)gG&@}53fuIr6gP>YXvT04S znpa6fPL`CQDOxp2s%t=2jV)4AlNtsMJ-Z*rE3rxLD8V1w62t; z(L-8IIzpDTtvV^BQK4uwHK5W}B@0QRXb6V18m$Q`3Qm~$bMq|v6RCW)kIXmlBX(pIv9iY_$ZnGB(cClU>23M&;T z)1z7n6G2K8DOywpl%ZCNXi)-$141RT4FaViX-ago>qAPV2)Y4uv;yfWluA=9bk?-e2vs3Y zh0Bx%jI>6bI%Y*ME*A&|X%NtqtECc#kkL-5OidzbLqSCmBc!BpA)=6=blVLIXhxSs zXhfM^w38qzgy0k=MZt+sr8JJ%3|NrT0BCffh{Eh;0#^XLHGm|LoKzYeDwHOv(gUDf zTQm$>s!&ZRw51vf8bXy4k<+4-C=_%QXiQ2_Qt4^73e%;f0*4kP1luG;{?K-2|Egi1 z+Rnkz+xk8pT~EK%oBKWA#PRocHfRq2{V)3cG~v(_$cLO`nTbeYMN`D5@XR&STG=ay zb^e>o99N2osk)c1`D%A?G{wE@@&AsmS98a6!LGNnV_dm?5n-9p)pBax%u`h=gcjW= zExD?irBg_>QbfCMYMjeTYD9~Ysne>WXrk`oX6ZR}T8W!-p;e0Ql#or1DoS*rxs@Wf zYG|6cZdA>>R;~%{V*rnZLWj?5uNs#j~c}yD;>ZR1*g~xREDx$q=F&qbDIMyf*ds?=0Wl#qL%- zsBvnYF9hOT9q{m+5@m8Gp(YYd;&Wlt=aLR_b*VW1#Ui8oUH@xZVp`RI3eWJiQcZ}w z9XXXNmKP8LWMzonSrrT8EYi_LM z@{L?lT2SE|Z)u!c-tSK8IOF-UryEm?LawtjFDrRsk)?d~lidh%gDEM2l<5nh9HNPc z=R(5CFg4O*tqBMi;Ejl+mn^ecvX$*@XvC3#qD25ogmz5sqDgikr3#RciivU~fU@Na zqneDdhJPVUC_t8?wHBmN)R{to4F@lUDvh(*E)eS^8gWHOLnzu1 z%@S;w#7t5^-t$!j*pf8Edtrw3Gey#eV13WNeAYyrHX)jk5@_8Npr9m@wlhzAH>1KJ zaUGL}x;t8MOJY(o5cWvgS3P#{%yT-r(pzeET&1|E=A*}bojJrjK0*-pBjhi3FTTVn z*$v^32BQwEB+Cf&j~MgM8s%e49c&+oE+P1krB7SKfufK)NQ3Z1@w(1cHA{6wt0uT% z-KjIP$%lutFTbwQ@9EAd_mMP>9eb0o@}xS^)lzYFb!`V_L!L5mW@aOra-)kSSlW(? z+J{9>R&cSMDB#?5R23BH+X%`k2QeKK3<8AI7dOtPyJ65RcBnT^7Rx%UH)Ne37{10d zgY1{d7r}48y7V1;(E0?F_F`gLY*MPr9o(>VZeiiYi$V}2O-T}CkA|a!Oi#n8+1Gil zjmbEU$=cyVpEh*1@N^xOW?3g(;pliMy)=W)J$2J%uHiDCNvrxbvxy>z7^T2yx}L8cFpY}4Xdl2=1|b-htOBQiZipr z4VE&DqA=yMeb~vbCC)TW%*34&8Vop0Sb~cr*TY_)JC(kU_!rI3Xq{6ghh`FXdhO>c zxx<}WQQq}BL454aOo-`E-kb|(lhf537mRgv-8X4TWs-F#rbu&2Jl3n-Nv)!N!ia3@E}Z&h;c+8X1?P&Y4BV{8yiKI?e6TvQa?=?3>E=z2&c_ zevX)rYQ-j znf;o>Otkh-`;W7H(fv0R+n@o;PvQtqar(qPV9X|9dQtm5E!6z?OmbE5nSxS&RQOBycjxnxl9XLbQiltjcShgtz1W3dTK*1nT z#1lP-w`E<0FXPEN%?Dxw9#V7RuLFm0h`oFE8tkLXW|$d+Fxm2%Wwj|G-QCO29*+pr3z3ebDWEz7~&^#pg`_+ zod6Kd-(RY;$KQ!0kcAxECMOvp&s>cRNeOw>9*8LdCWNAzVg#xdf`Ft7T0n`VsG2CG z45Ne*vOORH5kUPPVn9H;_s~s;iebvWg~|f+iuRkfI2vsH30ZvZl&UGtx&` z6c|2N9X&*XU>n@6)%VoW=Xm=N$Js=GQUy_xLeW1xyt{Q4$>Z?5U+r&X9H@Jrx=T za5_ggaDoC4!{6ge$bS<1d%q%E1dx;>SURiajN@j}l=VPFCq@G^>Nl9HJwnjUYr z&&Pi^dq;lT@7*2eZGu9rEosEBuY21hH+p(Fqj6lG6XV@^(1FS`j!n7b-0kkZAW0n$ zeCKg@cOCBW@%e?y&R5DOGb+%DI-R zi&Ym=u2ZX)oi$ZSBB?r>Wm1IIyBwD0+p_7^I~_KYnMK+YnL@f{RZkx0Tg(4X`Gfx# zN5ozrJnE*CZ=^r*>Vw{$Q8^H+X)3Lo7R%X>1{cqR9|*Tab5OgkL?eWz2~=y%M|?eDudm-&FnSX zt8l`N^E_?g<(tdESs$*uGkWP+#|+*URWj{3!7J&mGiYyEkR)pe`lqH^LZJ~7bW5&N zZe4VVCMJkdrzuvHbxO6lF=|AWldCfBhHpYaYkF#bqm-WKiB1(}xxePq*0gL;bsTPq z=+3ZrTS~v$xKk6z+t7>A!n&Q?7Hz7=bqVj7U}2|!^mJnC@j^xpEs99K8(k4YsUeiv zgC}#6u(hYrsP8#+J3BfxCfhk!j=Z$gT-w97TJ9W}csVBnO}g$PiT7p<8GVH!K+L0UG~4volBtTX}D>0p4=O@a>j zMU1Y>>K=&|dN?e@Vg`AJ7)j(;T7c|b3(H%M%?89lka-72zdE0SywpMh`U7VP7b;yX2G&EQqDikAq6CDJebHeV$B9BE8M2IPG6c%WvTu`PZ zl()q&mJ>*ESr~4QR45cAq|iyR7;t#J5mO9(7KoFk489sPR*?(Ng(_(5ASyb%lhWzk zk-kqAIIgk8IBkb^*(B((kw}IlaK2PfpwWbq9ZX~ap0vVriae2#5H zGA0?u#_et z7J0%;EtrWCmnU$AMV9U@w5O6+cdM&?r=cU#VsQ?3I5kGbLk6JE?)^HQMRbw6g`2KX z@Mg?A)zPSh8Q!*dS?N^y3w!aXeHzx}>ylptmJ`~8a$RgrNaBcvXP45{;mlAd(X)l3 zX;)5(hA^s{D%2j9BF}v+OG2R<(JWG}dF5KaH1+NFjd{V60pf_U0csN*ArT!RLV!S! zqBrVUG%n7LNyFME2&8+}si>E1W2HKUIy7WZb}KYG4X%)7Z6r{N=s?s)NraE}5SS7~ zM6X#5v6O)#I}we<4Y?Es`(Z+%8eR)W2M}#|#lm7)>PaQH=xL!sAV838?`B_;0TQD~ z1~`JelI{e z(`L!TK1Pm+l%HhXw+V!VnjOZhoJ^UVb_e&wKrzPp>sITdb)?ePs%xEU`T1sGv=dJ| zK}(YWPaL@e^PH*&tH9o2Gbf_Q*VFm6+C_C?Zv19g(pJ~@Kd&3DlCb|p<_ZBiA%4Nb zGib9xoxe2&QTPtS)DxQ#DKw1H6a-Nb1j5V^)QCw6FjS!fD#AdNgG@0naU&Q8GX71k z&Tp25KXRqz{D&FsQDc~AzodB_Gys6};Cj3ME`I;YiTQoI0{^4m1Jl#_@2E!eA`|I) zQ6gm)zl;kcgk{xegrmn7)8o^8>FkwCY^1lMZHBB|kePyz3^)N^48UB}&aA-9##HO$ zjW}dHad(zdV(C5aU6Zt=g(s9b+pi70Ivw&SH&ls;7alinf~Z}J0ChenNc8cY!FTwABI_&GW@}?s{HJ?TB=UDf zU9`|)s?5Q?C>wZb=7DN&4Ac4e2O7;i> zzy$-I@$doy7tenWu3rwHZpZ_ufKU*x2muC}HY_mAWv04is=5}t3>4SOa3RtxGPn6z2du=KzxrCj=-H3PYbarrj^< z{%5PE*VFEB{~#Np4*!9uH4nj`y@a+6htNMF;Tx_hk<~^ z05dkM+m>vXgv1af z0Sl7#JL@^nohd5K%+i^+sgj7?xNascrV`bE3AIYYF9wwVzV%~hRi(Op*2#cbXZv&Z zZQb*6Z4Pa5XKAfC8gLiXg;OHZma#IS3SNT|a~2P7rPK;kp@h*(tyn?DtI&=_%_><% zaQ-FVXo$p7GX#-DaRUKQ2{7T{yb3*-`fE~Zk$4@m=VyJ(0aX6O{mWf889k_(I__#93mHlF_aWxF^J&CUSz-{S`|X) z%jnh~)Jz_odxGApPl9I9g=Nf$nJ}@&79GU;DUGOs2#6XKcF%?kpMy)zk)mzo4yaUD zMA^Z17&FrJjD|8S5C;VtI5NmVn=N`iA3xqnevus{f;l(zd=a2I8i<)TLdZtqyI3p+ z1Rl&>K_4!>OF27&N-m00jb2YkMhXrn`KUHkDrJZeh}d&QZ6Mb}J3geKe`8QRLf1VX zNGN>=UX9}YDU`Vhj#?=?!-7s0CMx0Yyg4|=IVtx&nLfr9#zD}V98|zaqOF^FOOA8Z z7aGBut`r8gtgk*NOrL{npq)fmOkwAakO)FT0?x}Vc^*17CU|RSwy9iI=d-;;SdgR7 z9GBL~xl~Oufyld}j`~VE4b%_6nhlo+2}%e&`6hX-yO&;x9TTHOp9cPHpLKY2UU1g6 z)A(H7CM}C+vA>bCaNXVX43dOsS`-*nq1MOqN{&v?aO=7kMIFW+aiyrE4aA8_@svzE zLlFyW4zr~T3Z_>LMaRXYWJbZ*!LoPn!J5%UvaoxjVX3G_1gqE1f>pWXmWwQ8hfSvN*X#B4KQ1 z$^835mDEdB+zI;9e z``7RNp7#%4S4p?{GF6x2tgh=xDPC`B-e$MvZPItlHO#6~O=_o{f&we~S;^GON@aI1 zps6I0%pbiX{$FHE_WAAlNJHEBe;;i%#}gceU}@V;q+h1&%ot|-ZHNR6H8Eym4fNY> zi~|g^p3QccvjMJwOk%Gwm_K3vpqsmB1d%n{_UD=9fO2y(<#K`Ac9f+)tPB%*HT7+z z?%MeW=nwG!hgK;GFw{f@gdr$H36=%fa9ImT8y{hPtVYPFE zb-Cz4E&2xv{U16@Na>zY(baejj}!KuV?pc()dW;Ug2YP;As(_Y3{c{+?^l?np3g-v zltzA!r*ErXKR*vYJC}Nklb}z&Az}gJm;-}1dtYnWnVH`1og%nkvaHnD8vq2%GL~_G z%olUvqM3cHK6S=2b*Lgb@*)`#3ir3+5FK~<_%ohauNO;JJctPFh*1P1vnh5&0k1pm zLh5jy{qgjR%AUStlgTKZCzwQ!Pdz<*8@?x}9em@>@gicwARA#ov$jkOF@6`y=(i_0 zNWR8bVQ>Kc$I-EV#QCNL#ofa1EqnEm-2&#v7fvEwlXl2y+XX4bsG``Bbf!Tf(GfPl zQpSU)fl-($%<|W-JPOMH;+ha)~Qz;i$O-WWabkrfMp(d##Ge6bYW-7gRcWnOz zwHF_{SL;v_GS_24FljW=iWo(O7!d(0WemY+ApRfM_};&qWOHs3wERRLC-h|;g(5$^ z&}8Oh=7F$DwoON z94aq#QOC3V!9^hiL@`Oqn<%3d%UV@ps_Uxv>bpecxmd3JE5_fBrlyYyoz)#Nhck0_ zdokqamvu3WaF8FkcRrBs-+|bt%DDVlA^?)jNtIUI#YcoO$8b`FGfehU0UdH2ommYm z(#$Mi@8NSry;en0l6oQ7<=(i-FS*enV;;LZFz>Xm!cL9_MvFP!`4q{F>XE`pVWEuX zg%&*^vI;1ZprIS(=%#mm+2?S$bSdaL6d;H&j>wqg5rv42g~(;$Fxw8vI9YX8WwEH@ z9%g(f)P4{zY^x)y-^c1CR(yY7-Cuuv zubtuZuVjWETKM#qEy^qELT?`Pm!wyZMW@1P-QH;kG4;M79tS`q}(1 zcgfZ15fA}izvs8p#8v#C*M+2h@dM`R;q)pMPu7e8#(OtS?e*in&Tb&b+CQ~F_6Hvb z3;~-aHn72#osrXG`Y#WcTO7_y-)s#GWA4ux4SIi$+)v3cKx&c-<5kisHjK z!&VyxWmWC!cHMX4^Ey2G>sU~1Be~QZRL$T!?~GZ79{iM{XtI^A>#3CTdpqW(Dva9# z;4}!Bf-7GjKQgk;bc;%fVKg6Iz-026+7 zqd3#b>ztG~4RZ$2FFw5$6}y5qNk&q^EL|5f1^~&1Ys##?;%)+Q)zx8O#n z@8V$Xu8O#dP)lJbibtMUe4iN8=Q?q8*9q-+2Ig0=wT`-eLY%(61M=BlSmY0N=N(Lz zE0GpEvgRUG6DsB{xVmv_BGFS^9Q;eiyS{sseOToaqS(G$z2l_gF|5gToNbOcnrq5_ zzXCcRxw@rCLHusV?sF&Sd?6OeAu$v|#YrB%%|2JDkHC9$r+F_6BBqKmA|t}Y4E0L< ztESaWy7H=<$#+edU+q@4+~G*0LNzt4U%ffK&nD`tR;$h4)rrfKtt9g$RHl&TW=-N# zQtpOKwQ`lxyByW2u{SE_>BuCi?p3zRMYNpEIHzd0D(Sh0E>U7CY0{gdQ>k`TnRe^< z-#c-=?%&tL&yV4}&~$^5G!ap1TxfB%AjpVX6tWpxNIFDTGZw^7beP!+UHuYt zN#ji1G`4LgjcwajqsF%FOl(YS{khL@&r_Up_Fil4$(mL&fT+&XjVgLyT90mR;>);q z#$~3WZxxAx|I9O#vd1|%4~?ARNE|TnWE{`ifN>^R=IiFYA`(;zaZ0DLZMe994AeNZ z*A88EChX#L0*R4Jg``L4N&F;Op+fw^GFYe2`8g#J_6JxLV|NM9<9F=EV)+@4g^gES zt;lwA_m&N9)k&-ABf09l}jF3FuEma55QFAOnEGgjkbCE#yak-sp zKg&iH8A4b|fFy}2N(>4sUq@guZ>7|mI~F6~4MX$)+0r7;G)7T;bq?s8h!4i9D$&#G zYvOAzKOlG>>u9KtN0r+NdNau&B99Od@O_ z%n>p>Pg+?V2%dBgX@QK^7Zs>(YEzkGbc@;a&ZF;&t4>N^x-*!lviBiC^cDy|1>ZV; zgoTBP|No9add!vS$+Q{o5mQNH1%VYzhggz&2 z*d0fWWm=-aMlxFSN;nvNf9=DZvngo3IWadGzJn!xvh(a+AmDL(d3t$rgmns&q{Qcb zwh@M8-gx^#WL4$t|InM~&s;$!WJ?k&MF|}Iwr#VuwVd-#?iEX+8{mu%W&19;{&#Rq zx!R{D1h?ovQv>i{ZceAE;LGUVO0EHRtjQgra`_N;eL2?rw6ETIrj_M+wDB~RN&#B+ zd_x87uFLkLBmZ6b_4&nRJ;^S>tF(gd0BT{bBuFKq6jh3?FX zM%p!oNUE91ay%rIDHuXEm?>UeESzcsqN1W;6%Mp070*Q2>Lk@JJ#MI4Fi6`9)U33D zqN!+RNm`VrRNgN+YyJdK`RSDt#1P9o=6PTJcM82#ydp^sfxt}Jf=zu-sDhIGWIS&p z?%A03>O^!g$=ZrPm=J-Q+pIyZaIewSo-RvpJf(V5cdP2?QMzq{O8N^Q>Yo+QKAZcNH{BMqvmD<5-~(WwUh7Y%fCH-4Xi_ zkf0xbx(E9$5ZA{A4Y~3^{b#(I&JAg} zF-ZzEMFdb-k}vzs#sh+>my;K`A|I&a!sztiMh~suy6G+|gU^fZ(&jaWd$2b@S(q1oDOu;XH+vqxkHoG4G3N(E9EZu6j z>$_X@eZ~vaJ$k7YWc@dz;lj+6cWz53Wuohctf(RVl}Xmo`h}vs%+JZ@*KqZUSy%U;vOlRT)N?{Ij!ynKBuGiAlnW zLe_&&%lkFnB6E%>(&qnjiOf5yxX&ys2-a1#hrxClaT94z#<*TK<`>98-J~9N$jx@r zyuUq~>XICGY<=FyX_eW0(suKTwS5LPlBTDpU)^TYkNa*FH!7G1VAn`P`sFWgh7P(C z2-D7leWbP%crBM5Eek$9Z(8m|F77oIP2E~~BqQH8xNbhCR@MkwI$s{?xG1sRHDxUv zS6NnTue;fT)@d8F=UOupZ2Bzt(eWy6_vKSU66uoBT`ST^=Lli7>6{cJN=}Ox`O8cA zfg6pJ|LV3KZY6_lBIY}Ihf5iAGWX_)8shNez2AkhAojk7Mis1zTx<;pqK2bC0-}|N zssjEK1Joz6sr|=B7%2CLsV}6jUM`VUwO>XPJz{&5!!ZlZqlZ+hkipZuY*R=YP^_HP zq*{`!TqM(kjds#%0n4+o?!(^>!q_76s3{$;)rF}_h86M<2g?Ww0R|x9c0`rN%fln6 zNJ>J{Vr>`P;SKl$C#icZN($6SfoV4#3I8b;c!oqqYVlH%H@4!4DL>t%$v+g zzvuk8hRohM__5vU7%b;z92xl0S4g6q*WH9T;&Y%Ds77|4h%`Cg@0?GB2zo}~`jyTe zs?rzXC_X@oOGbf36WG^f+s3r#)++8%uTh_gOCOzx7#wH(9Q7s-O$%=*pvL(Z(O2p&LU45EioE`$8ulv&0a9+IrBgLxySkD|KZ>JBLCI z7hO5C!^1PZ)Vu-uPGSnIoRo4jhUUL4t!3ynJBhHD?WW9M9}k^$y1gs9eRQ8Lr$led z&KDkuT)MN=1l@Q_o|6ryG%Aj;o`*T?;MbPsJYB3^_{D$HX;52~LqKTKw?@xzPp}L! zGXsBZAIUk245GPUHJy`~!q>GbQ*yC{eUC7*$vpK;_Ypnm`EhWh%jB|HSjHUWeOAJ) zBM9b8-zReU?nf=HAZ0ZvT1L7vX&2v}VVX;l+_O|a&A$gd%$-DCf7TmC0m05GThp@_ zbW6DG>q`b0;r|oB-Y)GeS0!{$t+usOlVTYz?XwI1yFvXU%xk@6%;)vrw)C>54rqEb z?a{kc&l{{NaC^ymy@P!)Z`-9_3wy(GnZ0O~EG`)&+o>OOIO(~dH zNAA*TyL6k*oH!sIcxJ!!>d@nEQ$i6B7dd?a$#pQn%cqCn6WjPetz#B0Cc=F(@5X&9 z@=1&SK({A_zh$6QpqxHFFSQB(h^Rjpd;BQ{9##M!d1hON=gxWHO)g|nr=9wodG0!1 zxK!L|b|gDz$YgHJHQNlLWiO)JfV8ZOEo+JjN-7SLW3V8fknN1I*~qt6!u-e<_tF~>r@zXT|VOu>hAq_BH{6Zmxq#VQhJNEQ& zYJw4=Xiv=iES(P>O@isXoFTm+8S+`ztjo>htVXDKwNX>eLkKVG#QvdZ6G+inzmRW3 z9TA*LUjtUPYfYj^h^A>wLQ*HJP;3PablCM>zf6xh=;Z-x;)$k1yabV~9kwzJ(%7>t znR_1|)pK#OKC%Hf$Sw{M%X+iiiR>c_%oC! zhSYUBbN&=z0PzHNt7#7O)pDKS6nW3_oq0?ao%TM~#MzyJ7Yu1|!I*pV@3Dh^dMxyQ z^j{TOzv6bIok~Ee1FkmZd~Q{EX~~|W1Ospgk>q_rep&=BM|d^nNIVg!tNIwfnT>6j zQ`+i3Y*Pzp_E~XJ>Bvv#^16ki3E+B#V3?bFrxFcdcA%*Va-|Lvj!CY-Hmf zXEl9glyTnjZY_3Tu{YxsD6f~FFjhJZ{0V`f*ayfTP@+&nLeBa7w~vAdJ^y#$25aUU?4G z#OknG;At1UaF|?eXII|e!5)>Q^lKp*4FkjTWuUssRI{w1uu`62N*#~OvtuGAMn`+` zo{@kVwvw*hQ{aUNE635~UmQg~&9vHa`Edq+uk@-(d_d509NSwMc1SqyK2(Uc)4o^` z?0-Oaw$XTnG5?@4SSZLaE&W4C?4KdVfVPkfB$%M&A2$SSESQm|W86WOzrPT3dFEp4 zsSx^~32k6DU?iq)Ds|LpgUqfoU(;~}!^X*l6QiljdBqTcqrVNLIGN_FB=v$10p-)- zR^ULobddgoHQ+8oZg3KiF1QjH&a>Pn@O^m`{R{&m9Mhyyrijy^Rss+zmomV6=xSdv zm;b{XEEW|$gr=;>v4^|Jp~U9k7{y(VhHcX`yBUIsT<87lqxw*zu5o+xuc0z~HQRdK zzK0(}ncws#X5}g7ej^z>@+*Upy;^pgK}WwM(P2}!<;W%nP9h&5lYl9qXkwiRw%i8iodG@7rtErlc63rGZ- z394l*4a3)T)|xnbRb5HV@w!Ufa{q@xv*kG_%O0!5HWjNw5q>mM>Eve_hL z&&+6nG&+-N3uL}H(GR$b%sfrRuN2~cuWf?Q1r?>CVyJyZ#e;IwA=`&KeP*LqHzW%` zLj@T6_1hAQe12l&bynb+3p6d*RGUYx#7K3W<_o=0qa!&0=ui>+U8M`m#X|$_y%lG#qrlQ!&H{5-f0qa1Sn*LQA+RFw@y!5*WeA=s zDBk7O6MeuD5;#6dvY*?Ih%hjRmnHU(j; zW90}0$TQFFD(C+pn>L)VVH-NXANw`a&A;cQm1UxO#^hQWD}9@}-zj)lX)&7KsRoAV z9!$#f`6h$%7mcn@jGTgoq9`CPD5B?&x1ZTZ=xmH@-L>6DCcWy{mY7u`f(vD%RhnH< zqK*^e@?z&c@|>_^er{wa!fQjugAj6r`}vRB(CG7Nlf8>G21m|0#cmP5bVi)X5QE4k zBWwE1otXWgpr9ZBBC+UlHdpQx{Ho9#_U4Ck7RR-P-BL*Z$jbZ~Y)t5fiaN9qYz{36 z8~$d{n7p(oE63uA0}XT5!)YoqS@xs`9)simdYM9F;s!MD{vOqXr}sB+8JB}Lg-(eM zUU>FuFa&XE!y)nKo>9&Agd5K5Nrr!r0sU{Nt3gXUz~UEu%c8g68IgK@}>c zI%-}3iWsy!EHG4E$g=O|jbZP%xm^Qo32|PM)jtyI{RnX5Ke&zc25&wucZNAF=kTUT z);v1Y=F)duvL78)FEg7AycPEMJ=g0JTOWKu)m?`&;BMe} zr18r3qW`0h6<^8=?*}3D^yEzR%DPFATQ9MwdNC{fm$XTMSwVp$$MH@wqU1$7^ajDC z;zcY!E@|GeD~_bxe*Fm=n*!4Q1Y)UDd+Lr1?csUqI{C@AO`mOzW=ic?=i}!MzOQ$_ zCA@qRJGwN_Rhxh?fE%AtPHG+$i|g6<8)ssJ3CFtR*Y&Q#X&M48~x7`WSJpvz1H+uTauqH=byW`wh; z!X7uT3!KdFjDxyqB8b0u$N_8I)=5D4pyL0Ou(+uF<5vn;`iC&2M_{RYoN4;F{V`PY zUE!;Ec^2d9V`7MO8uxb}+$=cpSaE6d#Wb*_>&5!?drpbQBA!1nX!n)Kh1`EahU6p= zcp*Xi5To5k0r(?e(NM`Fq9GTwl}@7nL;FcCCZM{<9~d%|gl32|#>r9%&9WWB1V7SW zs5OX^2gEJhSsXT<`e)tgL5va%6#?J#q$;^(E<{X9BPJ2fJ_sAvhwxKs+B3Zck%sxr zxotb{t^7L{^WTNcGPzh2Bo*DD+M~;)z5uVvfP_)bI#r9ElLMst*qvF51ZH3tatV>7 z8GICtk@WACA!>@z6D?FO5`g7YJCL)O?^$k*n=kpg@NAHxIlR)%w;O>5r_UNd!n9UU z^w4aXNlBQX?=C<}(})boQip&#PesI+@MK;v(vo=C_Yg%f94?g;?2|4kSu`SZ8?e$V^~sE zQL0Qz;-?Q&{|@M^Z_hC<7t-49J209g%_96i`#D3hwfWTs%@W22$2-3A!;a;`T5%5` zN^BIDwE_FCG!&0L`Ott4d>zrOflQD$;G$;%_P2lbjwh3ZLJyU+pC?vX6TDcEf)Pcb z9_)F>2|ml_>&ODLkY3Z>REDJW;U=QG_rpVnoA$ic1}LGSc=AH+GFFDs;@0`-p>_}0 zw!qfjUOf$T$Znq3emd)2a@-Qe#~K}N<@Hw{SVBiZiHc(R&X5mJ&IZ{d{xvcUBaT5S zRv7N#=DBKE|;vUQ>4?+#Co0s@`R__io-scJp`eJgqatLPfwO zLZa0o8I}Q}LKrF$F};DXx$BLq;CyNQmVLz(0YS&fdd&J83!t$2GH}RG`^V^Ts1*MI zrI%Ni@1=lMb2J6T6EXenPqzv(f_zcW<*3!&HO|#cTe~{sx*OyyAZV}4{aKVyy}gZl z7^G3UVIR=R5RvyX;E74L%q=7mZ>EsQv@=}LNw9a+zPY}|p8=~E*ovg|C_rFzG=zWD zSu06RlZ-{l?eg8WW@B)#sZ%lFTL<*_nf6Ts{A z)hED__@C78NMYRE-cQr(3?t5{Sw!}GDV}i!l?~hL7jEy`N-mw)x2BE%qSe;!C7~~N z9z_Xmxvw|gY^#xPddFGKa^Lt2VzQEmKH3Xg%lH%um?3>Gxp^_5Z8{-9!L!vn1Q)tXR`(K#}Zlvz{T&xRA78n}v zaS~FqD}VooDbfuh$~=I$`QfANE@f!yLkQ~78LNDgpIJwpGv>C zB4~s$$ecTM{p{+|3(r55pB<+D(yG=KzYAyFh#jgt$C2>tqa8W4e||L+ch{1xAeQ_i z+jW)dipZs!tA=lLvCOdum>#^UuV&w7g?HdnS6co@bvJeUhd3#$!=i8Q@r)Oy;d}KY zI@0eiK$tv7E@@2)Gc3vM>V@K}OoGerG|aH9HrP%_y6l6A5dL|}x+O10HF5Am11FA& z+meA-(Kk0T31{ATdhJiXn3y;tS4a5riB1J1j@r2GT`Y#gr)qxrIW?J%R2jpDslCi- zgdP=3DI8*7t#qk0Y=kfv$qc~C%1+yd-j2i!l)&Spaxnk`?VAOI19R&q=AwCTIyUHH z)U0$nT+k_(u7+M?{J|x}U2z~v2mV465Z%W;h-6a|`lBk&z5$b+@HH|6p z^y|R0+tFIFDu2)$csPcaJH=pNEJ~m3_%YtwtT6fcE{-c65WI9nB$_O_aZh7+$DzJ*Q&N5^PskS)g z>Ca>RAQo50okr!`?FG@^<@~U{AK&)z`QKi|PVQgc<7C%~4vdwTfDWS_SwtlqkNlgttP4);8HY`2 zh9In3_DIe#hxRTf=J-z8YBj|g6UVQ#)xPx4K_|D!^sLRl4T;uE{0mEGNI=k1Ybqxd zxrPL_XuouX+IM=FSe$0kxmNR2R=HRZ<6c2JO`Tq>mGOF- zvrwtVNjp2)up`?-2-60c@{CuY(TO zK%rKGiB+aTOmhe@-p(DkpK;(smFQBjRz0_cBs$r zic7I=hRL34V#cEKe#T}~AuK(xg}z3T%Z8UX)w?4lp3^wI`q!>Ofy|(5shw)SdO@Rv zPWw{h-NQhAwB-{+)KaU8RwD3lEIHP-KH173sp4K!o$ib|l#)Ef@E^#En?r#qy2gs@ zQN5b+%7=luBZ&|JZKytyV(36|5%JNmlj6 z)X74JYY@-w5w}`I-5}j&sp(Ow>a&TH_WFeCLhA5nd8X<7nk08y%f9SxcW=x?40Rrc-Cnc>b;Rw=tU|c6TPRs(iTvCZHixYs7OK zhwPv`t)`RKL6)0y$>MRk`CO=5vZa#1l(DTt%2y?Y*-KkltJG<%pfc%Fv-9w@sZc9= zm*~EgL7QU9v`V?gVx6j0(?g4=PLJh~&9YW=HWCO_z_8GvFdvgzofMcRg#WF2q?lpK+WSbG5 zX@Njm&E;dAHzmnxa`IMQpj(+b%CGca(Zs<-Ca+2{zO#Q~ibmVP1yK92sV#Gh>|ca) zl((fGrEHq}GE9ehsizm!sRy4z8l#XJ!H%|8=R~y#w8O-hdWeu6FR&$g-x1%fff>-= zls;}avGZpO%e2H!BeAV%%td=5b130pV_(iHx-B!K>hF@3sfj(?t#nmqJ60~!e!uo+ zdi!uSjxHq+AFpM}lqN&#rYTej&8`OTn1_J$!WXGpIxOHJ&pF{axjW{SxuJ8b%FV27 zYnR0?edQi~9S)G>PAqh(I;^|iuNrEpHIbHR@=9o}S~_wBgN%2V>65HtL(a1e8=znr zWtAdktByeD%55KXLFnoK_^P}>WXp7>W+`fm$=vP~<_DLFWlOi78wN(pbe7Vi z)C$J8S#{Mak;x-oO7x0t$HlZJ76ajB#h$z!rCQq^@HKvjAB^QsU+t@-Y|C7jFsE50 zvke(XIL{ZkebbNloyb&OU|E(>!}bnlk_}DkKAvi;=UKMbn?t3@HMkeB6IS-Y{R4Gn=-LfR-!W) zW0N;F;;t~069mu6?v2ThS>x_!w_PvcSk3Aczwv2La`&=(-aTF?;`3PlS+?c(JGwZy ztlNJwND7>aPJ4GgTVHj_{Qk`}?c&CzeC*L<_ln5)k<{aFgi150dB&PiX9(14*iS4R z>R5by*=;-AhCRg}eW*8bbvcs)a=p5r$4l&*S*AKXec3&wHvC1pfW+sE77p}6$J@Ma zMM`$(mjT(o4huEa2;NalRbF_sSoS#Kiqrz!i1LcV>2xahUb%M z5#chHoDh2Ps#~7j>ft!?3IQD?M~P_3-1d?(IV}Gi0bDC;>4c1RhJV|_+cM{*i^(%H zl06G5X1}j>l*^#G3@HavY8=#wGLg|mKG{Y5peziL)xLo0lP*;^jzZUOofqWj&+uJz zwEpF0fN&~xF}{cG-f9y)*-UE2$2h$jN|-R}^>Wn@JG5S0P#O%dWm@&vc%e8vP!N3G zC%AD$Cpc+SVFO5OD-9W}XLb)gPh!`~_&$!gfuyK*llY`H#uq5`Qi&{5JEfa<5@uK~Duy}m^+@!av(t^74flh{1Nh3S)A{NFj7aHtL?KWGR}S6M(T8=WJU z@*Jk*nT7Dh7)U8WQ!OFaee@4fKB-bXJ;twv=C2ANXGb!GKe#KGId7TU+hPKtCf!e1 z;Rw$H|1EsjH*zxUw#EcWLWzE_)6Yz}*lWY*Jb$_KZx`R_n1#Mu@7Q}R8P;WO<%VQ; zC!Z>(&ZTADnazc3?o^QEuArI(TjQiwTLzZ)kAL4x@7jmq!|8;Hq@%(|aP5^Nobgui zL?v+eqkkhk*9fYWhGl0`==4IBIUv9m|0iky%I6gOz~{XXa~HVW&QotM05kJ6LM=EH zqSt5`f87_5nS^*J&NZlRyaYaUEw03q8U@OAA1_%gg?=^cg3{e`nZ4p)&-EIQEiS>cl>6@m+0-k4&?EOu7_etd?|g(}!9f ztese=QcUtVkcxf_(xfd&nR9MfTD9WSGY`19i21#wi)&chUDAGdQZu+#9tNPCPE3^M zMlS81rNSGj5pX|{=SU7gXipZ_8qH^Sb)k@R8iuiYRuM_i)SHgwxl%5C(j%O~+R9Ei zJ}hRw6Qa#bNC<8xYLMiyTyX_nt=e7$mj|hcg+yy6=ORr?o3FkmHtxN&kB(0spj%DEnQ>bX1l@-`D zBn#MGPzav+G1jY$kOXs5YqiCZ43Km#zWlt*t}Ij0mPeX*HATZ1gzz1rO}a4ylN-f2 zy>$d58?hN_;x9_xEO%Xk(&gD}kEu@cifwODerEg?30*N8B<~A^*S8qKukXpQMmh2Z;?ELYg;@+?bP5?k1KOKGE6S zA4Um5YuXnD;Li2IPB7=Gxs>#rmhUsmmBF@O@iQ>xI95!EdxfXFz!V(5bCR>KnVBV& zm|aaw0G@{<+JYHDdfy-kElqVshh~a%xLRv-Lw&ZgCa|8rcY^;we~K?*f>n z@dm9qcu?t=$|m&e_31WBdtiwEhApJIF+wvXI`oA@F^w{7a*;xG#*25}xI*#9qHS>{ zywYyal+NxLO&{o&&5UwbJUTrO0m<|_8n$PdCWvRx3>#XiIPYr`2dqWdxf-$d8KsSDK@ z9r5OVNgI%`KN9q}(@RfWGx)sjlNkgL6=(*BQC>}FIjo}V=!wj-8FJUxt>!k&WNE8o z#Szx=M<4l7+|M1)YWa#UmwhtjA8y9pICqT>5)-s)E-?h&YdUo}lC^7))bK{Y(}qli z$*Qu9l#C5RpH`uKo%j~!Mv5^?6}I$s9E_wr1s3h~GQb3Gq7lSQ<6vG`;lSW`P37lC zxaEI0&@b3{yKm0DDP4M@8MlTg>6sK0-mdNJ_=13}YpGVk@^Eqx=(jDqLtv)WuxtD( zFak~K_mphIl)~uzqHXYQfOB`3WW;cH4gRAGUwxLOurn9#!yCoY+AG?TLq1}#%DMWx zpU`HFrv_oi=2nipjF2HR##)JxHi7K`$XgeF-!x!djB15`-wAqJJoW z&vrVqqJm7DPA0k?*>A*VX4<#xC)mnbU=Xua0JinWbal=G?Sou}@w@*18yDoRJpsR5 z4R9Vc+~>OG4LoBZ#G}Zi z28hpknW&(D9>)Y3&GJhnF-wZeXG!D9i-m9zA40SMN6Fy`hZ7CvzYICCt3&&zNW0(B zNs6V};L1k_eK3Y;z=#f#>-xx6@Wb* zv)>hBuivaHH22Bc zY4J!bEmk>!6l}lz1uVn%vlHUNi0_7z|5GGPIs-T|n6XgTnOhh&%47x4D8Shl%CNSY zl*gq5-nr1fgpYR`Ji}Zt_@pA~f#+i1Gg(|bmLV4R{U9E?{b91J+ymS1vtG`YxGnq_ zpFeUwYmeS_7eo{e;?X;Ui$CV&SpYL)ADbInoUnnUM9eaU{wp5O0220hE%7P z^~)W$#`R$B*I$j>(gR`fXfNtFNoJpixz{MZ#OH4r|4r}?%MBvavb5^Gd* z_VxXR9!0Ekvbo#rQ-|Q)ml6ql;iBdC;d#-k$ZS6{K<+So}>*r zfE!cPx%VqOn*tL9VyND`PfOwTefIzpmkXPfx^D`6Y0--HzlcH9)lG(PaevJ7@(crr zi$jDo;EmUs2=A+%g!gx&)x$E3!)xzD+2=Rccq{z=1UckBruR6aoQf5kOScj11wNnW z3vVJKk^o?!xTv4}2zHb`-1U*@MGG44OJo+~Qa#F*cF$?M~539`2Q{rs#=>odoVID-UrI+LCf z)Y$%Xuk4n$-jPCtcR>3mvl*Uc2dp;k(oQ6}DbT#V##VD0OEor@;|gg5a04fNNa4_< zvO{Cd5T9c{TG;>iXfE?V<2E>=*D<$~WBAE?(+r!`_$XTWdq7y5Vxn_uvAwb3qKRjs z5?mCwQ!QR1$JVB=9Ev%i$(I@?KKnGL&^@=n)^!nTl?fE_M*kq3N^RLYJ3k2&Ozvy1 zVX`yt4Qvdn)e}19riw3Aq>r)cx0A0BygKk9(D!=hCENr)0=3ED^10G1 zF^34TVvpGnp(B71pQ6pWr1OZAbT|iVn{P@#86@JCf~qmf zf5M_D&ka(f)QQVLL1D}#E#gI)W~5ut)BWuG9f22a{D$PM2O4GvgVxQ{0{p%q(cHCO zE@ktPBos*nP=+zbY?!aq*&}!9V*1qx^#|2?>u?Z!LiR(Yu0R9?3+({n}%aebB zB-F=3>Ss9ff=CjL0c~QV-{>EhMLG;bgb|plR*pMlC7B@dqC%gn_Yh*5m#BA&^3>zl z2s+0Z^I0@D`F-i>)$BO$LNEuc5`?|Oyz|FpyhFdyx1;tAZx1vM;o-xqK(L+Cjrscz zCS^bN_mwS#)Tj2YJ-1C$#)2kx$_DlTVYB?$!$%jPgGlNZ|juxw{;Q?nt0u?jlqVUDkZok5fs@|pPo7wMf{3p5( z9At?H7Q4szeYEdyAuGOn;S>0qzAJj)kiS1*cmIpz=@gQi7^a0mfYa0ZH_l1>=plW& zGuL+;V(8V$Lk#OlI$c}Hti?m!sXG?l`cM4ArBM!n>t6- zJ4jJK`0BkzXKbSRW!<)3Fi?}Z3=b&`|0N$(LF}y&m0j^8%w?Q_x_rhCwG^@+UygcS6nQ|N%K_8>?y?-jVV}z^8mg0T%EvYuZlO;XxNYP_ z^cuYQ+I6I*G^1>K@85jzIIRneJcjgTsz99wid8zZdMfS)(XxlbLbsTEliohobe^3j z^@uR2h$$C@RM!>eG~&j5-Nzm~nRA{5@gt&KcQ zEmjCG;NrEkVLEK%K^9z2u@M1zD3<4>bmgx*_-^ny^?CNO^|67x-x*+jOV#H_D)-=!F8hB6QRPQ*ni5Ylh@fRqRU&mchuOIIwLb*VZ_mc=7&; z57{j%b-~jUu-Qr;3jBB%_)SfX+aO4^s!9;)Pds&-Yxr?! zZzd(RHtF&bRpVm<50;^MS{4Uu;bW95u_VMubhcFaquJwU$6jak(wQVL>YAhnI4L8O zzqIg*Xg>juYXfdFb%4jGE6+DwV!afTFn%~z?)w5~hsNO1fvw|Bid?x>;hF0O=NiJf z=O1@>@SUCne+UneAW}i`QK8B1tJiW^nddT5&PUe^(fkwi^OM?;=U!Gkf@^`stBGs9 zv&~Q=$a&4~NO-~uq$>G1ihO5qmC%1;C&QNX8sXdiCQQW^QZeR-ecxUA;;H~8X(Q1D zQm_0t)12EH$HmA_@$DF~jAf#rYQx7*rpkMnuRLfC36M+s%+@;s@X^^i#j?H$BvI0LN5tG*!{UQfYSA^zHfQ}|!8c7OG}iH28r58p5$vxr!}(=G zn55$1MrkvqPu{d>+Ek2=pCteOB>`|kt(3<^IrcFOoW5y4I~LhTe0y8S*Vnz&T<@m| zElNX+X$#9sY|@!q{JtGKq~URoLn4ZbJF9#$w=;6UE-9Pnm)G!_T6f~~A@YVEuZRP4 zu>4Mb8d3SmewY#%<@W+fbuGqaknppg#ZBdzKECIWsQ1x*@a!s|zhzu^QC_^Y?WLs=L3Az3#`;e=(Pe&JOC0&xkP+8CycX zi7UO22v{3z;9!qy(MVOHOLwVDzunO|`scd{us*+diV41or{6FJvqCW{twavx3qT-f zYc&d%4EMYXL;U5*%;`}VKPc$R{d?@!zcFsay5o5}Of+a#0j&7-$n3uWZ4kdL9 z(Z%Zd`OImo3-_rYudN_xc1LZkScQ+*(>GQ;Cck$z`FDD2AXo7t(iD^tV@1F7K!0zXZ1Q7xswAWnK_0s1TsNy^|kJ2@hRqpE;tt(wPrV zc3~Qq&T|$Qu;8Ef!_w517r4U(PjyOcIAvtUn?_)pb|ZsykHQ##Hosy{+fs;UUd|*cb6vB( z#(Ru#Loa*+uOYs~9 zqiD6UD`1}QsdT^?owTa`Dnt3YO>7-9zzz3|?#(!-avv|Bmwq?Xpqi-fe8$P-68aU^ zJ%0o}i^#ae^FbA)fH>qV8bFDU8wQTbZ{b$h559{X7y>Mx_O5yR6ak4_#P%XX*eOIg z0BT~zq%s&Yj2Pl|Br`Lw5mxx-6?ibBa{j;i*$f>}{J3vEw}&yWXR_sHzNi5X|u7{MiRfWt;lUX&#-HJ4Sk;} z2qB#J6t6#pRh*6qr@$=NG=XB>1}HlrS8gZH@$i4Oh%E~32ACJRYg&%i-NNYvMiEE_ zxgK|0LZ*#YGIq07P+#)*7yuh6nZTKMXi%P~@a+a5su;G;XBYR-;^P7*e8bHOkl%6v zDt6Wic;X2&DufjtLnnWWuco_VbFclzpG)!~Kf7&L@5_Yr=F3}brm@9OMK}~gRuA4_ zKOp_ep>u6g-6BbuGU!{z&1jHc3dMfgc8`t9K>|o8ND>z%-w*8D{c*rZnDj1LGm(l9 z*n!z*wn3KqEuBpImb+jsG!>#&NtImrs_Z-RdL_59g+eK9m6}!XK}b`N7$bIWL>f!2 zRpJzR>rI;PO$|xvmwOBW^wa6z#)38MxvOo?#bytTGCp~9wrG4c#RDia#vAQA=7q)c|ZPc zGjpo+A%9B(Um*}e+B&0e64O2#hlxAKTzpDU%={-NhhRsCoPl)beOTSjF8(3S^}zcI zho+)PVhFh$ZH$sZ1`voK4b>Y@`k_|9C`wX?KpVvf%qRZqI-c1x$+X_rRKu(DxNBGT zsQRAtVb`#Or^K-=%VPMOMfChD7X`u%>22!DAZ)+Tmv13`U3@P~)1V$$$lk~X?R0^c zsQ;9ZJD9o&07st}js9IQguhhbu4WMuOe1Y`iz0~(vd9%+e+SLRb*`)@&S^|N6!|1S ztbW49UNQdVG%|?={mf+(b|ymc&ehuL)^IrHI5VUA47bCx~;8(WoV1H5w>IkeP zVD6i6IDmGi4Jfj1v&*_L3vbMDuQDI53ENwTu`+>trlk~ke>mn>uxIG&n!KLDNJJ-H zk+S#}j5w9xK=BkmD~f!?@37MZ=b(`9oFP9|j}UXh@UVxBtQB8;ACBWr3*EE?F;Y%S zK~rXPfAinAt=F6n$qt^&?!GOSLKd&&{PEesrAbvi^cE)TRjJAGac>xOY-s3;zz{lB zW`iY4ZzaNV`bkJX+r#7UMAt+JmOm~1qOjO}_#%X9E0Udlzs#QpdT$1hIs;+U$sk$Y za5m)qLwTyJr)7#%UE`G~4gWKqkkjbo0LTd`*!k(jflv?1si=xPU3ed;%ejdy3A0!7 zo^0Wy&RYV1ND20{rB`!AOaMB=+Boiq4y*s`O=SrE){@}})6>6Xb&Z^O&wM(37#;N4 z@aArg`qt|!1g+Zb>ywaS`eDQ-T%(Y*+_bLmF)UtEz)75S;QvDIW6-Gf!}GjG+fX(x z3+AoVx9|>ORs^7DV`vFkG&d?y*DF;1;UpSBc<^!J@hPPP?DJXcqnB{Q#liVh*OUs4 zf6JMFg2JXsufXB&O8FkxgI6dW0~>o-K`noL+Z@oEE?NB22S?11bF2yoW}91u;dJ zchhO*JDBr7ENA4 z3?zJgra9{#0zyaaJP^+0ho(V!jxUd28@jdsAnPznM&JiQX?=*oRx?<$u^S6}ohMHm)D z|K)Sfqk&BzVYGye-{+x|1PQe~VSJ=hWc!ztGD->ZPus$lE+KzAKK7K0b+C>%mib-3 z`SF+PAFNIlI>KS)tU8g7Xz)ACNsgD5*h50yUPj{rzoRbs-Wq=K1?jo45cfv@=v}*6 z>d0RQwaL!_u0QxQV&}>-4-$DZs}wjlce+Cxf0hfZWgI9a&ADJ55oc}%^UmF!-C*us zlV|J`B?Z`7dy;^dG;^?Ghdd8x28$k>y&vIn7rUxAdBqg`m)1S(%I?Nz0hKW^?N7X-Yn=Sjdw~o zmhA@pzy4;CupjNqM1#jKqpc784hI6J0uC?D$`2X!LVEe#+Uo(d8{6C$4@g^lw%6ZC zS=^Z#S6})iO7F!{-j-KvdPpw}w?wnJV-3_RDJcsu+j%PV!w zzOJbP6V8-dYi@v;koYm>xa#w3vN~pD$2lhIA;E3> zUt5DQLXWhcvZ&3QUkO^a3zs_rPOb#)e%6VEc`_D*#oIiGMGgeM+G~P`b#zhPJtrNZ z8svTR2`u1X&Gk*U$?kodj(Zo>(L?A-~EtYWjq9VQsYHCdPAH*~5`Y?=ld!UoR zHrU;dXeVYZWYqtN6idDR9+mZOx?6hL5ggqrN~=HJ?*9i$K()V{0BDAy3a>0Q$4$&L ze%`a7Mz=7-j7pHS#mEThsCF?q$e#hvE%+lN@Y%$%P)?mM&oy%*bh2)rNbdPkys^6! z!##7`QYO+6OZ%e) z&>IV>6aN2$FC(lG8`IO@(<&W@%dIA z68>M#{S?fzW@lq1~9bx&c#e|{c`Ar19SPbf&9O^18rWo;rcR& zpPvGk3O=C20i*c{`{1L0@Ex$}5AfG?;$eL*Y6LSD5pTSIoK5&+_`|reZ_QfjHh`Dw z>G+GwcXYk1_vRTrPhPb2nEvkW`Y5*FY;%Ew%zLtuNFo;siE5}b?eKQ#KdK(k2|1tR z&!hB8bDxqvxO7j{X0+|C%y#|%Hn+=D0&kU})I~o+ayt(HQQP8ti4V6xj%ZRHgm*4d zB2s8y2oHph5ULLfvAk=RcFksBjDEr+C6OuqvSyO#@7{ltzUwTmd2^h$n6^p7mF#gg zZAbErO*bI%4%4SGF9hW|RI5(KH@qaWRERAGFI>gz)o<eF(BBG@%eZ==U-b5a9-#5KQ8KGC$06f19cc6cfbg zlC%jRKptZ#QV9|RN0aeSFWnIw$=T%(P*Wk@jE4ee_a#TRqoJJh(ledR1-uMK}}T@(MeTQRTNNqpFd2$1rN_6C%VA)>p`u+{57_mHHH)m z{NHX?`xEJJ9JhY~3#T8Oazl&wAZQ8FuE511sh^DvH6*X^)k*xS2;~nEl1NUthDjuQ zy1>MC4|w-`+L8VGhbOi0Fyevd6a_*3Rypd>>D0Q6oiwmgA1($f(tsnm;s%U9kb}xx zgzzE4&&uu&YrAFBz`zggIPEtDOsL%r6vf?uWWbyH3v>-CY%CB(z$erX=U^maOSiX6 zs3u@x3dc{gZ=^t;N#}=Y5`2@p2X6i#(tQ&(LdTwy$7v#|YA0jW2F=Z*ofbpjLT1tc zX=4*EXlXFp8<0>DFduh0o{JqUG`z%m&jFp>*S3703E|o3o>o~$fuY!sFmn>{v%haH zBytw!hc-Lk6OidnVF2pI?s~nCyRRbynE04)5y&P-m`9=>8GU5C##AqD8b)lN6q0;B z&Xd;sG{+N+_ua;_(j`q(}{G3Y$i@$Ggh%pg3W-`qoDZu1Aun2>r< zdKOH}(8)2Jy4%=sSR?7@@u4HO8bL@r)}%E%U$=tn{I|4T*N)uqGp-%+!(HS|r{hMs zlOUkPKrukn4H$u=OlIcEELnWF`rXhvM?RRmtz$`(nPHM)VO;Fjjn{{B2a6;M!?uQF zvjbMFIhFp^ISnvO_FM$PPstC-C#pVcdPo%C_kiG;KlQnmh5oiFANl5`EeZ`G!#$cr zM4)OSz7F5GVYoTz4ot*`Z>_3?Z~$%o^}pc&O!qTM!-{-y4%B;cQoXx~8O9#?h=?f) zS&;tJXgwG3mjgPrm^c)qB;ZZ~Ayi2d=?*d<7iVx?JNyIQX!ZN^nHLd5&*WbOEX?(A zI7-__5Yq$o_!ydn{6x5eq6ETEPzgCk!(P6fGffA>QgBsk@ycu1AMklao0%pOAMc_?~T$(Hxlf13-5=cTxQwIL_ zGiLb+{Q~$fkM8b0q)VHt- zGa}cdaUHqy#LJQrayfP}hJ%qk@#8c%|13P^!KG?qnUX@$IWO5UinP4%kbtSlY{`xFApr)zo40hbPP|~(P)!5CMbCWyd9UJ zyoCm1<1idxxVX74-5vLI{p{2(yEZ~|-PUkF^3C1f+Alk9b$k=H3kYAYswh)J%Zo8q zS&U!uNom#UEJydMGSFNk0sZQcO(h#I7SWS3ZWgD2w8E64oy|m3Z)EO{kyiz%QHFrM zT4|v>M5npf?Y<$4+Gn(4Y~a1P*eVu+;6xO-aC{mU%H(l&dl%s}oE*j53_3f9B75+~ z9^TL#hglo(Iwwc@cH4^_%Pi27_<6(Ek~_y9r-9%c1MCR_hw}yxnvybu0uZRsO7bA* z0)Insya-}B$9GBFjrvo%Q0lcTEPFim=Z>DS%pV_FXKp`@#2k*1!dVk8O9N4>)fp#T zL*WR?zgZ@H9$7mCcTf53KJ8{wezgIK`;%2fkqksj_k2Wspy2B)Zb|L#aEZR1IW&#L zlglC?`X1#E(dX@epLOyqE>AS3|S3*$0uw z1mJN9dP$W`Oxok@EwvH2c;7Ja>`xA<(!4A?F*LGSWQZC!c^)w25c@FIr{)td678^( z7TNz}oEM6^gpnisaC3o{DDd21r2j)M(GdsZj>QA0cs?P4rX=peY1T~oTj{lTqGtAM zp(64jh_J;NBs(B!AF=gqY?2_z&0HZeNdD;Okx*?BgeBXz&WTEJ(2uKD{T@NNAs?GJ zyqh(zYOq3Z>x4bhS|+G%8RbO0=U$w1Y~N zsX~+}6ro6z2}%^9LKGoDG$BHipwI;?O3<{eD?-vVr8FSWG^GPb(v+nsLQ<5{sX|aR zr6EXC6eB<*N-0R8LIM41hSZRLPg&>tB+oO{6e%v71ytD= z&CjT5&(<%W+=~1*=cUnX8mX#RMAKN~s6|GTG6V^e1Am0W{S7HDi4s_&<;qhX(keeb zOtI%8KQie#9$SqLQFcni36hLxiQ*C_AT=t9Pd$(FGIqM&UdN#4{5K2!cpQc5&j#mW3 z*`7p-3DZo0+zeAOQaOTS0Z!4R*M^D4#^wfm%zO|x&AFe}eB+1GA-(fHX!*f0Nk7n! zZ@xhHS;BG?Aqe*qhGxN!lAQl*%uDVVNE~)$f7n3B-ok$ih?o66%tzKMriqYg3Q7uT zO0Qj#MNB{?4ImT+DM&PwG!&6Ug$WXq4Ix2ADNQLtM1?0(ds*!}u==|-Xn6P76uB6{ zdTTS^frs>3pX;COB;7s-o-*0+=o;9Ns}h@QQ4SNyn5zzIzqWX&E>woxe#C~USs6wK zJO{LnP0EnbjC`2wK^lkXfE-~NjytRY#&fPiGqW&~r>D`6pVQ@kQ%~uUBobdmO1)ds zQ`2pcB9;KRTXapr*b4MqeE$;#F8QxV2Fu#^?yuY^%+H32!%I-K6aLNFI)6QT;oPZg zL8L=fRHdlovxst(#GS@*nH?M<`5*MxioW$P+Sr_zYv*`w&eZojn~rSrAlR_b!lq^U z-!xaBk7);5l{hQw@&2x9N4q}A<%3!&%rS~Z6A*vB(eQ>@!x}y>s}X6dGL2n!nr6MB zb^N3F&kjwT()FJiw?MHPp(9QGaN+(=C#2@NnDHw?p$4F83`%wQL~2M?kK97v}Jh9D27w}T?m}LJGi)Z@OzB0c?fAR4+qmr5jD5U6WYC7meuAbU2Pv%Uw1*8(BS~I`IaP4H@hA#&%Dc zW955EFjUZQV#1Rul&5X)s7)+4^yW+)VE&T~QkOz^cuC`-H{JSJC@jP>px@B)IeH}r z(E6jv(mNOjsn-Z|oraJ|Z^2A}*Oo&`nHS>IVqBLoi#A2(QqGUyY6(Akiy8)4j@(4U zMgCnDco%9Qa7V%_ewd@kiVFosZDCNc0ty4|X%9gG*2~1KcJcLJ$HFmteH)3z7d5Avlm18X7IIl_9x)5K;J;2)D66OrNXw z7wWyI06#GY@VExxr^r=5U#%J%Rfqu~l%W=d4UZlFKb(Mj09XeR z;D6K{Ob-C&oStup{>A6AZ6I)2cF5ls^!?)$qYxBmH4#)r1S!JzAV!&@Dz92QiEvSf zG;$&~IX?Hp*BW{NJ$vW30;ThJ>pD<*N|I(#yW;) zbA^XLSnX;O5D11h1KOGGJM&9v0Km_$TGgvWJvsa!)A2An;M-2qx}72^B%)%0W2kHl zq1<8*e(Lf#WHBvKa6vi&*gjl-Ul<&BEnCukNRmo53AesmWQ0f@XvQEDHesB z9X=M*>aU@>8x+$g6Qk)LL9*^Z4Ern#*d4>1)7d_{^pco{jOp}xMyBDyrvo6GjsGre z)!XpW35xe}-th~WE?{&tYwb)2W(oFpGdOP-QymY%48bJ89w>uAbLi?hR!qIaohvM) zlL;g|ktWf;pxw0ZZ#lvth0WCL-F23r-?Vs}pArqph&&(DG1*S)OEo1I;}HGi1BOBp zB!|V@R1}^ASx?L4_CIN!bdnBORG)*jX=m#WpYa)oMs-i6mUZ4j=k=dXC&M^s#iaL3+xBXx<*+DG z2jz65W4VY4$bvK?V5t$E8l3YS##^FeOI5cwS^8!;jgw@J9PP^9EY)kn(4RULev-wM zoIO<|s?PshJ*3i-DBHYbhmy>&v~_-i6BYGMJwk9UCTs`y!JxD_5iIQE152ECfRIb- zUSrkzy?$lpL>*5uev})0XEkI0A+PjQC9!cD>!GI<4;ED;6U3!!f{=!dV%0KFz@BQ30q8uqlX`&dW!3is>1AudI3e*M4YE=Kc#`5dSGAuL4Rl!Lm zFhx)PiMV->)}7(e0Fw~x&Mbe*1MB}8o>XMR@jB19hc}nbo1I8^uMck?s?o5Ab<^bc z|5(;}-E!%a$yGcP!tZpw^PN?Ex@`8X{2uOWr^f8CWO*zk?wO3Cyr}2pjTxm9i$jqun{KsG9$8{gom|NVya^lzgrup+*f7qpt^XLaA4%XO6vgK}S%oA2o5xEjR{Hz+?}rlncQVcId*7N2 z%*AQU3q#;QdB@{fq0l;U1d;eyS6YowkVF zV)Nbp%UxBrP<*F`Kd8zug>yQ__l#wQu9MX0i5qj?-QH4TJ+1W&*L>}PNA{t->5p4} zftdT#3$uSukwcD{_94B(j2YRWbAkIM`Y1irU)a)jzEhb6_R3&>kiVswirw)JTCd_4 zAkxG^#mt%;B+<+-t&%>hl~3AbFQ$rXaZ4BHM(!El>;z<<+Gb4L+4BIrB zO-;nDXV}M6P`IPA>mKrR`Mv)D-Hs36~ZF>{A?Ii>|!B!rGAdAz%xTL!`s^V^8&a`;47 zsXdWyXLh#CuFTBL&S%4;9^UPZlc+l$a}Xqm$zdQTpx6zW+a_*L*^W6oh=>Msmb)(fhlh~yd#lQJf_A0kGXyN(B5eqM(0RLZ|;{K}QQcg};?pGhQ-c(4=*5{{DS z??I@F{l{EMAqg)^?#k4UO|8y`bPqCpy`6!HFN*aSP{hzN=3HDg>~!z0y)Irhn6Ysh z^@~Qt)u_#8LP8Fhh>I!mN%Ob))zD8OgZ9Vp$Xz{{Yy-~-4(j!=omDwJ=IkTC(s$~w zr=IOHdE-%`n=0o=VY&Kmt8bcZb(TX)M(yel zl=-Fv0#ZfonrSfCam*;qA+>=Ai<-kZeHm^5vI)vwH66XtJ@0d@jp2yy=ZTEca`-1( zAo~)OaBZAXnRbt(P`Q%OzVQ-##4=>f437wBW}@obrK}izHIrpZpu%D?$KBUmd%{Py zy2DM)PPTTrTw$ADl#wz%b+s`dx$G+Oy&^KTu+>vFg6DZn=`iqq-NU2db=4dt!*^U#Da_)ccT*m zu5oK1*j`5t4)G3*eOl?~-RIY^dK^(6@Sjrpo`PGxA0eZ_?^_-Ym`^e^9%2Vn@!119 zl~q=^A|jZQ_o91F?(pS_;qwoaoVtYgXbwv)^9$L=M*+q`dyQ(-hc?7{6f6*69((Xr z*OAET7irAu#W50i;gS?3aeSUT8tA-<$p$HcZF8}(AbK)8L^N$Ex2nqy@wpARWZlb* z?imi;?Ma!P)xzhiYo-%8>9GwP7;jbK$T*DJkYZ}&%}f~D2FaYSeOmPSj~yze)1s7q z4AVzk8?PCfMX$I+AU5jJ6f~|hsdTV(v^bZnhDROY+DzzfL||y0hsD{1_Mb80;Q561 z+t}1K4|ubQ+~fDbukCe8c2Ym8et&} zLThT&g5gB{Jo~wmyi2^u*Ay+rfx^9#lx^y|=8mn{w~ zHaV`G18Xx4X%}mDNi7=y$DemVM7n?~0dPbeh%9W7XcE=84sD1_OV4T||4@f69lV1v z{7D#)591MbeCP8c_L2UQP|FOko9BOMe4+Kbm=jgrIh4gkL@Y%EU!c%8=3^j$i2caq zsRjX9DBmbzhCl#^pXvt5p|EBq#pKH$lUhQZ|EwxkO7=!V5P%(7rg)2s|N(x(^84PlcqUea=IziqyG9hWqk?3!y zF3AU~RAS1pVUZlp(DtK;hqQVmbq>{M8H-u55r4mpW^t7xb|Sk z4cHnuIu0e(I=6GgdCJUg;3uQ2{AX*pZP`MqcyVn~J@EuL@ z?#O*^I1b&9hT;CM4<1*mGqF0zWpKV zyugzZwlRtmG9AZKh{TjG1U>P=z+&N6*We?shtEQJP)Q_}5fL?OcZs!*KG4%aptyHQ%&!yN@)N z4_8714q7&MI}ID=aGz7_@GxW6_CwN%`~o})f-1fG$uLYznxVAJupCLTvoXY^lW;Il zzI^MG=V?bm{YPT=U}bCv43?O8Cyx>(a`J*`prqhQK#4K(@@`Kg>01D<51nFh9nR$B zup#Gp5((0o%_MZR-}>b0QQ_v>h60&JCAZaeTmRtC#w(iIh4>qWNa_R?C+OhVW!LT}oJuRtDlsX=UPPWAQ1q;;UQor30inKJUB^yA z2d2tUY#yNMdK|rPB~b4Z*s1Rm%}*ifa`z_<(ehLJed77GO)oxVy-YeD&`rqqK4+uc zSqGLbi1$W5Z?zb8eR)>$?qTi{GBX0qn7Npc*tOwRZP-~c z%wlLmF@{70gdo!nglRFlBt8Um< zE(|LoyR0bqCL$Bu#3kD*GOUt?MMPwzE161lfTyV3H2Y6nVYnv!M&iaCt>RglK!%}l zb*di-DGlN7heWNbSk-QKkX_^IVksi3^r4|Yh(Cbah-BC{T}EdUHpwoAW1wdNF{GiA zf!G*=2Idiq0T7ZxQ)6ckGPgtY8_tW|p}b5Y%^z2Ht%K>cRWIG_V@k4Gf`d9)&b}`! zCsRywEUjzVDq}{PX}P_$fWg7_=1&hO@g;cj>jn*|r$Np+Ih+|TYq3aF&*m{f`h86b zsQ0EODzh!eciJ4LcaLi#po)qjv~!=8iG}v=2W(x2bpm&OA|sa{48SOgvG(p5rHvc! z?>$ef_UulDJ@S2yJ`{7h^m;7jss>dOqjfeg=fW_4l`t8$*^YU;qrugLT{>1oiDBTUK^7X z*){d8xGW3?7*|#Hr;u|+^=BN)v(y=y?od%3pCjO49q+dK5X75mPsy?YmUoE?A||f$ zh&!d_%z7Qz9ny2<=Q;?$d)coJ8!_Za!c5v2Xpqk_o1Zy^n^D=d6AdCwro(ueZO+ZH zj4h}T8SV`!gDC_Io*dlFSatyI*zFH9iSvBVYP>v$npZQ~SlC5^=WY!O8uX3#!jrSv z>m`o#d(K^Pqb@iceY41sBf09&;UBwb_BFlpsUXxgqNzHHt|Vc{f0;H;u;JMGHj~d~ zw%qH_n)`W^GeNz>ZKY0etC`4gjzCCl0gcVOe`=U-5P`ktzr{3VqUe;>Rlf4$+Hf@I zGiQ8a(H2Rb6KDAqIJ~Q7?q&q%Q^7U({ z9xq``5D%oXVBPI($WHX;MbTDjJ7E)M-m+mk2fFa}JcejIgL^qec&ppv-ty}(+}4*1W1E6s`2){M5BGV40-VITkp6+xc;UJ9ZQ)4$aY}xK4EdwJ7vu+tTI%hy3xVkx@YUg=#(bGpP z+FQe6v70b#jCD-xRME0I*^8(BZ+q_r*uzf_Dkv556+VRej(4u|)7P-GF)sJ(& zwZcdt*;5mtz)F<`D2~*$_i-^gR)ZEpz~4Z1YryEx6Y*6x*Qm?hQthoh@;Zo5w9_uO zS`InLb=Icb4zw;~wDINuFT;7%kBDAAqr}fIQLuT)QI$1BR773|N=W7FRBIhNnQBRH zpqiSm#S&{yBQ%rV)oV4GqQcbGM#>*4>)=5LKWpxgfI>pl?HCCaVUedSS*|zupsjbi zZ-<1E0h1~d5YfNeON~h+%^8%`lG!7ft9FQ%@sZfa4s-qm!23W_Es9AcHklP2Z%wf1 zb|;%1!3py@kH}{3^%WzryYcl04>9i7eG^Pn15rgy31IthH7!+C&1qbb$n}BL_ba$@ z>^&QeaP4Woaeo7;k~69B`czj%M}{Y&DELPwynIevL?2Ln0o3hyl|@uVSIL>zL_|n| z;u=S4hQTn9l2c@5l?KeCNN!`C1FtugN4U`P=_B63^1W9AF&%Z_tS^M%ox!4Vimpm= z2^<6P`lI+q<-_y*kI^5e;o531H2iG&T`WDmoU}B2KDLC}y2t(WIjHKgf62~U4sT5A z{BUV?D(%LhqJb#8l+!^<{Ru<&G7nhw2zfdWtf-_htSCi^wXv?T8Z8~1Po(M4+{Ezi?5ZXz zCYCJo4r%Y;u@IV7TF8c$0{LNrl8 za5;r2gR`?DqN2y#)A-{gUyi|!m^gRDekx*5xh5qYCN$vuA@+VBkCYvsN1I0sYlC41 zXfSIgCc-ix!bUh1bchO=RJLlm3eSZ{y=`JtecZ!RO>&~AnU+jZviJ498W}=0p^cj; z=2P`OP?A#SQ^1%cw_6PdHtc*9ZeET!M(V6#vh4Z1`jwfKXp+U;9p73Ot8)?{qJ_)} zJ1A}xXl%U@gQcOs%?P5!5uwPVq1hvkvGzOpBvB|-cUcwp)IAyWx<;(|IB>Ux68>1p zkbD$4B>|5Zw-Yqv+)o-L$fM!<4xU}1^CHQ@Vrpl%6(gv~_K59H?&k?lDrKbkXZi(eqZ zU*9C|Hu^Bn+1{r!SFD$ZoDArPFB;PPi()Y-4k|hl?BJ!>q8itD-Q(__z zAq5ZnTbOnm$~=b`nfniRSZstiLxh#fHKD||t)#n*>C?4>G(`-Q5eXnfQ7@+q!&!n! zq9|kR(;uwrcqEK^hw>Ey(2Y?wO++!~ESOBnu!NATz{CRz1N~XM`e&s4hakq3`OGm+ zgnY7x(E;&KN|hftoWr)#exrqe-9!}JnE-H1u8F3WuA`sP8AyH>PErTO1V}*aqn)dPZMkOrFgg)KLlspW z2bpZVfQmVlF!lm{hkMZWG38DnPh*S}p2HSi&o2<)POY zbWd}FSRq!+7_twBKV*ratuR=NV5=heNrbEE2N(?i$Pf@AD92~k{cvL#Pj;Vri;xSs z4{jV_$Y@90N}>8>=_H$wIsLz{?yOc-#lUSACYr_70pN!-3`ZhF_oFjt< z?ZMXhr+9n;H$=f5uVdiu^l=#{+^YJY>GSL!;UQ{Bo;`=wsvnegK4ku>yIP>fAeB6n zFb#dqG=cnH%%FCOCt^f6@>B58fL)_K_ND+mQrluhcbj)ruRcJs4bPKq76bSvS>9!EV{iJ3Y=KL5&#BlFq&bp}$# zWIr?-V4I9d0)e535+O5!XI=++L&4HT2B-)6{984pdpZO5{Xz7Dqr^Q11TgR+c>7og zL)jmIpuLnNm1IKuuZO-b=~Obxt|G-!^b@P%NaenXl#X%;D7 zQoIo2i9E@N93mhH7eaBnUxz|I2YzNe_jb7`9yy4eq;7(wYh_o;5Q$n)G@tCBWQX<5 z1^4Slq~x9dUvr1JNyH5QPEsHEMh6^!1^zLwT(u|@Aq)$fW)le%A(>?{}Q1g zpqU6*2$_hgzrp!%5Okj(f;p~v^d^At_k-8-L>@soDM&CU-gYxcw$-mW z>fm#crNz{m*TYdVo$OwE7SFnK{LhisO z(me@nu@9&>O}iQUVJV>ii6Yr(^nL2;^!nceylzeRkCWp!+;&ux>3}q)D^UVaVUYt6 zqOZ(8)BI1LXgztHTt6m&RPoqOY3|TbNRw`B2BkoWn zbNeuMNZ25%j<1}K{@Oc9SA;*Oj}K82J-Z0){Teksd97qOstk6AKTKwQ=G-tT6*i9Zms+VI7xVU zO=vFFEs@%AqEv);6Olu_@KNuA7HNEOV~B_)Y;|F(dD)k_I+z2)Am6=lfgF+&E-A)2gnFbm(YZxix{9{ zm;>d}?n;Crm`Ogu0f|0S`EbI$d5Ro;!T!oe#!SytH3$$t`X~n}GDMG={m{<7$3NHS zc^~A!>}D&Z7Yh&l-eM8OfwB``UK$%PPfPDW+FWN@h!XL$kAE=B?7SR?O!X~fG{r(M)*ZPzBQiZH= zA;O$36e#H(vo^>|I>6WI+71NLON5MKVnRlWtQmw8f=&uq$TwqKr6$q6I0>LAV zA6)6A|EG*~5@>*8jtEDiv%0A%43ja~!4(m(?!S+NnBs*@C~)A14xS`46i`t~;SGtD zQ4|C}NcA2@#Yu~IoLmz&r=MaRw9`#}i^1WY(~9tavCM;j*0p-MzCN&E=cnDQk>m{GydojiRUeVPhL){vGc zl8O?TA%kp;tp0M$Low`=5KL0U6okaHGPf*u!6QCgIV`VIeg}u@2+9HoDNxB0j3A|$ z7YI-=kWA~#+Z~bHuOeMwL;o)he}7?e;=iY&K&)+02cY5siXt(=lXYlqB8t&dF`vm4 zMt^_po+vdEhz2r7NxLg9V`P$OvXp8C5&oIp0ccPbpr_g#HAd2Ov&B%}R5v!FVkeop z@wRNjsoq6|y(QGdM@W{+A&8tVBUsrZP@ z8K%G)1OOIiw;g|Dic=r`OPZ#m>XOjQ{@ImdLJyOKf~GMJCVTm~){6Z`;qh*eR!OJIbaFID^4OE8lxaNLI%ts$N zhtfWXes(gllT`mo%m2<*?dds9h~T@pFE4d)Jz>zesPZU3B-h@yALfN1P^g z^K_Cv4F6>P(>*MSI5WpdAf$&9plUi3(V)=2kth-f^d*>Vqf(N^CPEaZKl=m~HPIo8 z2sJ}%g`X_cB?3rMSMUiAe;{ViA8*8WoWygwAQ2;o7>VJzqaul%P_g<@=y9?UN`)E( z2-y5QG-$0tfi8-UgH8*ykRya~wHdM0>hCV|LUSM-Nz~wU3>arDIL;wn;LSKpU|u6! z%vvZch>VSBOdb}V8a(G0NZ4*6L->3S7YCptuMlQ}@8PtfCC-n7f?ThIDi>xPf=cG}k@gp1^x_gq4$j53 z@B~5WFpYE!-*b>zO3n0QK*!L}w)#;GMhIv;JP)MTm^3vG52G4h`G#~C_L)&AJh36d zi#>(al0^lV^W<3Zx;&mF`W)_#$`OakmZ+tUB^}Zdk9U+*AW;$Y)A%SXQG(56kb|V)XAvM}1VDWLg)i+?0;8$?t-5q3GqFm`xp8k3EF6pnb`TJr{DA$dc1Mgu9G$ z^XSBJZ{LI0IKApmBD)N!N6kgwpKEbPMnEwLgLHC?F%D2DFg^%57Q%?o#@a~HsM>}t z9>a1}*o_Nl8&g^^c-AJdkuj4CU2(&&N!elyUb!S{6Bzc-XMEl58e1j(Zah0M$s#bT zB*c6qXr9ZmV-HoMicyEcc|G(-Gm^_Dj40~3iImG4unnRafcEU?;x_hg+RP$)SrhN; z7^OrxsU#+UD)UXh=E3*RSB$UZ8l%Wnvn?FIxiULLn{D<~miQUw7sC_&YiNx10f#-8)!$et2?FycaakEsKq zQ>e=XNgY(t*l_U;PP74QhvM|OzX~K{hLUu;IKij+zoW$Q?|wh48riU|ytV5uh;3lG z9`!rdz*P8zi_kmZsu+qtaf18K4J(i%7JKdLw$BXA;k~s zB?p-yw-E!2sh~7BFvT5I(mbRZ1IUIsXf=sUN*PE4O0O*gKF>bl+D?5$4(H!R zjvHbq$fhCE5-z2NMr&DyLuc6s4_Mc@?C}Uyk1@QkPj>AQPTC86QVs<8+r?Tn^@9oA z37F1kS=OqL^GHu|1D(xM9g#(2b&-!__A%ktvmUcuUKzU6-dNp|zX8DEHTu1xS{W&d z8fcS{=>U{;BS~K*X$oJ@?A6bsgNxnsc^>ACA>>6A5=0Sq2RXk7!dCqKF!BgZWCsE6 z0Zz_${4LT2Y*U*jAo2?BjHq3wHpH>FFa&5vp+Ix0W<_Rcnc&wqp*<>!%oiiDDq2pMbtLIRq0P z@?_tm@3&L62aE(yUXfB%=P_$ zQgY?*^%xxkV0r5lOcZnAFszoZX4M$`uQKI#5fDNYcojW{p;BZz>w#wH9GS1Mme3W=oe$JF`t@DI1y7TPA(lD3&` z=#{3HxSwJiy0zG|w@J{uVm?1#+ApK;E3KSSilK4_|9Ci}R9GBy>gbhTlx$GuKPwb}OMOk0eQ%99fE^FvZgv53yp2 z2>X@_DwZSf@N6aO7Bb@1h=Cym5waRVr4*vJIQPTphr`kc10z(uM3NzRKZuk-lo#f8 z+d{BWD3(?fh_=rh93+H%E(6SPTxeW49Zk0*y-nRA9gfOGQLu5GEpnnE#PXu=pN8S2i zL*T|Lya|dhaF8(+5fUhT$G*AbZ!qMB2%BKXvJAnpW=v%)OtNFUY}0P7V#Czg=~|)) z;ttV-n=GVb93s>oW;&WXC@ar|;?Tjs#KJ@~M`Xl;DL~In;a#M97HponI^P3?NgjYj z$)OS1QSxF)H!~5(eN-K5bBKW21cTJ??B{ydEWtzsbHf4bayHeC?Cj&f!NlYyBrXl` zW&q?nOSA6iWPT~>9}T;CY&&Y?=Z9t6L{-AWPWaPB1^s+@X#V&fDENH}pr^Z|ihyX8 zUBHf#fl4REko1GfMH3zRz9vsBC*kyV=%>?LsoOgd;4vN8pA6(086%XMWGPN5G#(_n zC8c%>u}A~VJz(G^B{ZZGKtQJ#4KTO@>O| zhAuNt^h2SbQhwzYl|L*9WH1Lq@n39eUOX*4WK!fS|Pg;n^EY*Db zZl_M6$w!DTv|xnB#&Hp@1+@@29gCcf<97+dLdH(s-HAPf6iD<%x-RT_w@Yt0j(ay` zkq+)|PENRm7it~3w;XgnwVyFWL=~iR=MA3v1H6^)GcGD(gUDUU-03WF76jnja1riP zAakKygVwQ81W3HZXI5%5GGKk3k_$C@SmR6435`y)FgL&4BWq(5NxjJ73Q3uS0W3pO zxCgKwq!9@p37{!pbZXuoD*R(lLP&IebnRr5y|+WmWZQdbtwu|;1d8WE5o}sa&1VP> z{F4|Z7C0P;*!r+Nuxzr@zNkzPh8fS(C$mPv$K-NJA%g_ihX@h~1aX3e1n^@)8f5iT z9PR`hagrgq{aiNRFmyaz{g>|KJ_!{6*_3foUC9R_cHRTVOw9G4+Bt^I1i1O$PKr2> zRa0|<3BXOmO)~Huq@CXV4Rg{GMznU5^%4HjNfGiB)@FLxQRHyu#E|xp(d3*VmYbv= z+j8@qlB0$auq2ZpPyj_hy1!)8q1vpwQ3vc~Q<8~d2!`3U5>lCvK*X7aQ^^Vt14ktu z1U#Bf4XQf_VwRq$$_)z(0t7(}fzXh33J561*wLXe)JX`qP5geiPhtpB&4XH9YZ&8@ z40kU2s;H=_j(iocgHzfMrg%!4{k8)E3*~<)4wGNI16tr)Yh?MH&rvQ^Fkbl#nS8-t zl3L}l_Xmev2Ndc?pUE^^mXixbnk?Sdtax;Tq-&jKaiFe;Si;flLY+FXba66AG(tw zN_);j<{NGA(vj`O+iV)A8{@2<-P!Fto;oJeQB<>uV@cd5b_Z)DvY=*toA^#Q9@?0W z(hiR{sc_3m{=#3?@uy{jC|J2~_=}*_6jDH_!y*gz<{=U+KtU9wF?7fp6#$7ff<$Sg zLV*;ZK$4jP2@)^y6NyTNtWbzldpLFe4&Dey3{3+-w6C)qjs+$2v9}#pwpgF^%0m2S;IZ!ky7{H;43Pe*E!TRM2N%XK~Ektb&oVnH3VPns? z#gKcokkc^LE1AWrdQOhC)R5KPiO0bZ>^~|GW9P6kZg%^efToe=dhK`p*}=ZUoq7G- z^M`ocI0wNn$WcKeQ8E()k>qd0xA(B_B429oiVQ*E-n*TKif^)f`&Y(XZ+|%sta`FC z6;v4Dm_;Eno6aX{-KUA)kN6FP%r;{=A<{+Z7yrsVlAk$8A(V7d1e7jJLqE3XtglEo zXu!B|!&F*x20!3N>^h1^kewg(c=hX0-Vk}~Jz|f~XgmBKcc; zsG2EZD#YVXP(=krLbF)}DOfavg~b|NDky!MoJOpqSc}BaRXsV<4w`u%Upzht&rHV4 zHjwy$!3SeU(2u9j&lU1E-_l%~UfNE|?p7?{5vIG(%A?t1T;6HT9an1Zvy^J1a!pu{ zRU~fB>9*IEX7Kiw4ODtmhl+5s3pZzM&miI7lZS!Ky}2)`Pa)^eoE{e8W#@2ENj5P- z$W07E@7u_DLNC5bA}KK z=Y!4(+;zZ>V}#)Ro*aBULqQirqYB6Y5sKkPl=x8MOg7+DK&B`O@$Dd`pg8)AakKBZ zd4z+U$qGtbIP7mh8JSc;B8V8G5NY&q`MOl6lk?1;9NjytG?>*;&zqztd!jm21!=uE zxj0^9MFkcgTzy{iWI*sl_7Vgsci8Q8!udQdnZPs@o)B2Ui1I_+&_4Xh-<+I@hscPC z`1Wr^KFv6OP-r*ol+%1#K`$3{w&=$=s2n<KDy+` zggzj7BJE48&d2$bq-siTIBs?p?i{F);2VzU|1hkgr8rQa2a~eOE)NSZ zo`dMfa(CjnUBlZa;^DE(ZHm4Bzf=3(&FhyWArIjp5h4_$pz=(`3xhNZx9m1X3&Y5&Pdr>CktZp=Igv>Mvlu2+%LFl0AZeen6D1nj;1IdKBPG!%}v{4Yc z?YV8f$J*jqnM2wfA5Hfpcj+Y-ScZeLWaBsMgSnX_prdEoIA_zx0l$5p4vCWclcin1 zQCjx$&fZVorS(Sc>X4q=bWh$g939=Vakq{+p6@yr{NA95^&jk2Tg z9`c}%NmJpI;M*fdt*E2ahh(}LPv4CkxdM4FAm+>Q=1;14Kyu#$ob%_1?HneW$jXGJ z=`k9AYU--0`jM!|4k-pOe4-%So?1i{#E}4rL|>XfeZ+)tJ9Wl=hN@aswH0K#!ZM8! z0TD$^iAhUNWD;0_+GfW9g%+-A4mtTgwNxc>=A?(lINyS%p2D>ihX=L6c#OW9|M@bZkK$1|1K9(d>L690BB*d;`A~?b1DsmAT5bR(~SpoT+ zLzHO%3sqA}gNf>63)p_(K&b zD=4%LG%BP7L_jb!82xU*d4q`#XWgXw$}rim()gDM(M27>{0uphFgc^&LKQ&pCf2A?Afbpgq=6aGlBWMOuXorq7U3zKl6cNvzYo5UnBNLV$H-vk_-!^x)_WSHdQ znc+>&WJ&?@3Pc_B!5~UJJq~<=^B_>C=^*JU9CE%S5^#{QN@-{H4r;q`^dJj`?H?G3 z%+`T29GNipkhK2LZS6?4`c)6 zf;|%aMLIaghLpqkbh=ooqGBr8)fGfvu`RH(lKpnPGKCaW_C6;6NyeR(M9}2)J@iFi zZHTI;-Z9hqy*ti@rTopMPL8(XG(;#c{l%NJG6qyTk)~E<$%`>Q50A`tH}Y>#`KRKn zeuMi{{QXYFOh;+mg`=_$m!6$riedDIV@SdV4&Q+JIl=GF91GC+zmax(%xIWl@Kxu@ zeNevm_K~*Zj8c)kU^pstgxp$9+ZS=^nX{ zC5ovdF=`dU5V_E!zIqP_9x(@Lp6Q6?y+gt{2dv$LQQ3M}B=V(Bq?1zYVquE%H`YDT zF&^hnJo)MI<{QI$66afwAkfjE#aeDCdAAfL;8VpBU-goBub(_Y_qtqSKDl2cp}iTb zPR3$2Lc~H9vEq{|Wh9bGB5v_bh4U9|N*|9e1*5N@KISas_7O-=g}u#rry)#D`r*?b z5t@$JqGrLeTx82kR^RVoM3~tkLKZSmO`($wG$jBu4o;>}RgM{>Y3Ro|AZ`~Tjuf<~ za4KWO%2rlS1f&{7wlp%LSkeX}S8ms%bn}bA=dIxp6O~1QY@3vYPAx!`2@zLuLKQR% z=XB8=Qj4LN^x6lDf0fJRd*7ndNB7bCmD+L8gt9%OPV!AUo{gk=pMhtR(0CwvCX9DO zoju{6vC5Jo0S>4tj-5(Es*)rM5k?=C`<|KyX%LHwU}YweF0FiR(cf+)Gq1U@^|Og5 z)dTfG^!qh}_@+!hz-UeIGpk zBEFi<>oTyhh(5^XCe8!xCr7(uUnColQL7+5$VB!&WHJy%NBkF3w24Y0TROJ*`YLSu zh!~Y$SqKJz?I#!3hqS)zV0y~x@h5&x3mQpu<0cm20ge&*h+~IQiCBt>PLlEI=M#(_ z-d4$5ZZ7tK_tn#fe_%&og66^*?lD{;=027jjq!d{>w27rsPT#jc?S_g`j$5tQ)6Q~ zOQuLJi4aPij4*#33*1g0%n~1}J0_}V{$3{&aAPu03VdFfns;02o0D~c_MiQGM!jC-o3MaV{xX**zW{evQOIOfLym~ss*fm{ zHFXW2@_R(?`qvSBHybw_y-vE*((7-CL-`=iw{mp%6M59L`Q~MJ=2PeXzgIfxVXf;^ zc>8~g_e@zjhl}FjSS1=yR>H^6Uo_3@&pFY)T1Hg+^x$jWwO@PIop$;-LK-ox0&3)9^vwBEOBT#-{QEe?HF`$@(~n$QD`W{g$fZE zpno*lyz$!3vLaCvckS$Zp54zdu0VU#$;QZu0U?1#gL^pgeh!Pl1B&T9Bf(`&swPw= zND2txfV*kybSz+_WoN=X7|x=XoR}`QVdAgJ&W%|f_B{^E%p<(D>1^U|Yf<5cwT}6c z;n1=xDa4M|BZ<+&j&7V+Tq9YCZAb|sb&_jAn}88b=|l-f;YQ9HIw&{Q+|)_R$n9Ne z%bxtS2}yQ1vSNtg5Qv5#d>$jdmt9nd$M@|WqszlYA+#Z(A|Mcm`Pa4|f+F8K>u|UR zV}N4^9C{0=HPFPZ&$+ztH?CwnjEScZBw4QH)a+B4xVlG{Od`z_f-^xRN)RQ-J{22? z*H}m@k44u*wnS^Dc|<`Gz{58c?Eu5O?wuVjl{uRh?xAQi@U7joV&N$?`HIUikIbhH41>bTjgz3g0uxRpv2Aqe73cGuor% z!zy2fgkhn0aNm0{`$wK+dZkO(v8);!RiuJQ%qMg;$TmHsXKcnZ8rW!>5@gtxYBes| zW(=fiE83;A$5NR!^{|@hQ(OpwWtdQiXb%beDuiS8;Uz$a1ncaZ-xrkpeJ>P<@nf{C zTBhvIiSPHDZ&>y8xH{`jjKtwj$e3S6MuWIJgaZZ&C&JZ#<8fmY3Aw%DaFgkyR(7@f~}dBV_mB?=LLPKiHF#zNi_$fTJc1?AfvxHW^9rK#v zj3N0~UNG`&-CfnttKAQtFbH2e&1r2f$48y$?}(kR55Co0b@wFobI0Uz5PK!))Jy{M z9U>$bbQ1I@AB5v9cJ_=$snd=tV7!GJsGuEWA zDk3Q>MesxSOs5M+xIP&>(%CPs%ReID1SBUrXi?yxg2fQddGpO_ueLgm(a*=9tL9 z#<0STl5}_#ArZw89+L$3xj?yWDhNg$xcgr0znVKI>ArpfoY;<$=AbB@jhDoIFq>~_)y3-*RmgY$%_x9>$7k1EDtnZ4zKb&J{<)8=bRoLZ}A;n zNK3qMDwnIBN4~K_sk@e0PRwTwG-!nou>xZRD2u6wejl0ZS@Hs^df4#m=*RAqN$`%t z-n~3I*rV~zl^4E;-&LN*q7Q#E9v#P=@bvf3fgh#U$yOs)A7|`wkTc%8i;UT+R>%_> zB2_Di5_-f{X{e(N(s>fRj9#K+XW(BBkh5`G;=6vBZ~Q{lty8x?~pFPg)4DEYGDhX%yD z!h0%c*P=gUARe3r)XXql#5+NwjA+zsO z`gG3q?r!?|3~;dwTQNi(_t3u@kB0-PmoZ&+u^Q2Xm>Lq7A4)ke``_ZYv}V|3UrPmN z2liQZXzPcvbrbp*hr^=&1RoRu7NAHVizDiYlI+QR_f#K5bp|epd09O2BgB+C@Z`A@ zQtmd+`KXerW@Lp---&*9GPk7)bu2%{Rh~wZ$l7^6&gq)5U`MX{P1VQz|lbI&`M^^ap z@66%dq*ovaig}S0G3xtw9h4tWqv-3y-L2>&#W5dh6z6(_>O1e>f!_H!v9UDMv?Yct zjy-X<=|cnta;7w4fzk*&R)gX?+Y3MwWT`3re`%xD{^cb9U)xC|@kirX5_7IfL=&CY zT}PcF^yG@;t58WS_L6a!z(q^TTt(!B$KGi*2-fC3n%eET&bJz8qlm|^(Q(4dVwGcM zb?V1g5u32#TizXAT=sjX{0xGO9}mECKj3YfJ3K%d*rZ`>vZN4>jw%bO(d@_ZkL%!=0q`(MMF4z?3wzXQYHg_;sB841zY#30-v{DH-oaVHd_Z+dab z{iXM_7>G0!2y8?`6lnwqj9O42%QHm(OAoq&9Ck71KE3*v&z$$;_bb`^yJG0qyFqN3 zh9^p9H3xByTLw0qx!h>CG!M8r=G@0cdM(w}&}qi8slu`1v16+lIz+h%WdcVwOS_mY z8c+=os^@m@G=m9f5P;FORT>ihRSd-R!a__Ca6#r#bY6SBkF(4vf>Z~KArx7Z6CM_# ziG%BIf2*E#+LT-dMWeY(Csl;*xVC46cW7KJ1B z=rMCUFJp&gezetRn$zaIL#pR4P|}5scKEx$$2_{W-<#(&E&n+8ql3TF4_u5S~+iCv4 zgZt0zQJ9n@mjlRM84=TSxAKA@?w)HdAOuRNKy+W({Q$`)nnC;Nyuto!a~8#`Q2vSo zx&l9ol|wL02|ZIf4}hEEza?`+!ka0liNJ+yTpnS+ti zHbPikGFG_|JVnjdSR1hjwDT<~x)!-Gz9w(VZ&ZWmTa)>_5#9j0c8?@<$^Xm z9K>f)jXhm6O`&1=*2PI2l@)vWI?WB)AD^Vi_3;kr=V&!K2mKq$sYGX>^lyU9XcHZr79!w+TN#0BcZ5|;7(xcM2Tf+tS^>1Y8W`*P&le#cm^fY8BOle-G1IToET)RYcFE@d32L;1V z2XkkT^Tsa6x)X*?6;)~QOCy-?CwGZY;Fcum2%O1cxK(9FNWPClTLab;UC)O{m~l`# zzDwcQJ%S#vROtH^NK%eFD3UL#(4|x~?*h|i(N<^7S zhsecK-lzN62V?yVaM<_udMaz&fz2NBb>yq*D&8J8Z-=?~;m|rG@^}zKzULs^D_=pe21YIlZ{Abh|&^rb@L&j0T^__h|VXo_I3DG-QwjR<9TG7LY zEp|FbZpr8Rd)%mTL)V^_ialZp!I8$ty*{5$odce@=yCS&$`I+m5SpSG984thu|34v zTJ}3@Bko<+{#Q1Ld>c{Jdp%K`Wy}H5Fxiy_- z2%04(<)kUl-_y9tjtVuRr%U@AQG#V&KHYalD%4zK*LwE8aj4Cp#RiS_9Uo4QazNgx zYP-+HshsAF@09$a2^5=0;hd8oIw*WRKOFhSGBx)K>o1&=ginz{ zav2|ku#?;z*(yH`{*~1An zdLLX!$aA|9rc#cR7LW_J$D{Ku{~nXw`T48&#x~MKDPfc8I#K3ZTI`KswrXwKQwm=t zG}{Ce(m0})Jcxnvyx9`E(>`IM=dz09%^njF1Dh!9)@XnYCsInr%0Z+@!Cv!4@sFOuZIdN;igTHPNab$ z!ca2o^~iK+f3qjdWul~UzZiQXKPST{1->#0 zO4g*#KMRsu)z&l8Y@pKnuer(WNnf(0;|)a^L3O8Ct#E9sf(c!l!lLaFPNJq+_53jR zzi*3`_g;{n;{C|@b@y~BPrj$Q`_c6w#5*g$j<~R$j+Z|VJhL>D8Ra0(MO97tmBHT> z7b`Pr7-<3o5BLG|A+&5Ep6zfYD`h<9CX zXOGXDH_e?)oeZ}T+U-AjuFGm8@wa!jJT{fDf^%x7k}FpdGC)hCZ)J^dlX?CkQL#|j_6Ahnc46k`#5@a4v!Ys;`K<6avGSQrDZ5gAEEpHxgYgCLw{_q6$Ir9gGdE2 z4l-a%3b0yQt1Xcx7vT(0S{AZL-4oE~fnK>rV#x>Dv&_XWMra;C%6e@hhgucKyN`__vksMo=NgT9_~iU!^G*o%ij1Im`Tjy zdcA4OLAm2z8Q17<^SO~_`s^e!buAC-zf7U15shJxjR7(h;Hr9Z>*1C_d6W1Ci#CJW zRL_vvisEQN{4do?)@|TczP&7nDR1^?VDKR904I>dU zut7;oLKP!i-=&%;eE{_#Jhd-*CPyJp4WrwIhlk}cJpO!+M?A+<`qx+yEiR5w^NKFu z?7bt^Nt16sJ(%cepP}vujn5EpgA-fFg7bkgWfb$Gf-b>}*Pd{vo7V*LW6|u0g@OB! zBb5qT$89`%@6TZ19A^lsAJiPfwNfvg4B4^lfPo+8j+Td1YD0;bfuGLoZQ#c+J2w&r zJWoRqlN317lp+iI8K)y`O@Rj2!%(Jc&vXxdXkDKltp(EY2ssu6Zu?QbbLS&AJ1)rg z0C}svVnTTMC#fC7`|$Y)3R-JNx90nf)37fLI2V_f6;d*Bg91Dkx9d3O7#|!BDHfIB zaG5HW30xDOPh*f(mV5o-n&FadF1Aww*yM}(LxJsZ3`ynr?`&VZF4;s>Y2b!|$k1G} zQhuSAP%Tg@iJAnY1#BcBQwg%-RD_bWY?-vk!Vw;d2%;f=F46I6qt{Okgn~*pAgCtd zakeL;yyKzPeBDvjIAW)>pnBRz+xqS_&*aJYZkZvHql++4xpb}%tmlEsD#=It$hu?m zeV~RYSys<}J+7AODT28_yVniB#6jOhx1jEzdi|d9%=A--tl7gSG%2p(czsU+l^`Vv zBj*IeB??D{vFrzw8YfjKg;bI(dS5v;Cta0dS_x~gShtlfld>hUHI@pjrz$OJN>Yp0 z4z{dsLnNY*ssNMT*DVwjtxQA>6cocV43i{rrXCd>hX*Wr)F%-LrUx>Q3Sy7ZKy)Au z*If?WqHmqZn$g`~>L>eXO79;u@ zM`1=0r`jn9Net63u+POC)_bk3f@;I%X94EyV3%rKrMFIx_)Rah=$N_dEqq-#0 zJM^ojfV6kPk>YBjWI=LC)x^>_<&qMDRAdUMZVh>cCNo1uD5}XPmNZfw!KC_4=04iT z&gC9mquAc8T(e~Ws7-tzt2R!D=CaH2QHJM;D7=c0Fr^NYzM8WvGWQDl&N zO9zFneKr0*o2@f_&f=~~RV(my6ffm@(s)TfOY#gTk3E6Jd{dFygIj9mIz=uG&{;DU zso)(xd&-Ea8c&_LGyacUUUaIf={GUroqEQjgzk>K-a3s4ySCnkxwLjk#s>s-?P9{) zZMQnMc9Wij>P&CdCNz?kbbPpt9sMRc<{Opk99uOz@3x0%&FfjCdDIVHib{2d@0=J} zASf7+JUzdi{BUvTYvkzZ9;_p?k68?RmZ<%S$ET%Dv*_rb?pZmVkDX`D?+*i@?ZvPG z?IgiU1wU`(X_%U7A_{1HL>&;n75|)v?+(7>_Y?JolM0l=0}rc8V11fQQ2OdV>2g=Z zLjDqRDd8WSG>Y?fvCeD?3W!joWkO!i>4yr5%ea$K z6?Vo!0m(rzN9Mkim$(D#D8cJYm=G9!kE#4@WN#<4O|Uf8$%9{23fMhR+l%$Zr7S;@ zT7b0y;(#^f$ui1EiVR0b;`ni9KDs9|)XEcJMk@OddyDV0;1ZyT64iPzoajeyIUg1u z*{IIC`Cq+St|#!0N=JV_dE>k%PZ-4 zT~V}NyOr~y7CNnFT^olC%<50u*JSm$4=b~76MvZA&(p?hkVgHFtMY=|Ed`)*;E_Zr z92Un>6y)L@9wQadI7tQ~5;#rE_@KQC8bU%ZjO%5w{Fhy8K7D_l{nRKD6>E<<=XZF0 zIoJ0VScuO)CzOzWK=A?4qe{<^NWScT_Te4;c|9B5d^PXuRbQ<6hev}d#)dr%UymZh zckf>s(KI-bo0IX;LMn~N(febMnIbM> zuZ{Jbe&-!_(Pd62K;KEvb$X*aVpnMOc0#|s8PUj&-tMO^KCPa&Mk0z@DWN2eXL+m+ z)3{)jKRF503?`7InrJCzi@U&ifO8-SfvSj!X=s@Ol^`StfIE%{2e}^P9y8i`syzDx z?^z?)(-AV-O3cWp&*1B=&E0Bg+o&xOCPy6LICmn0Vq8;Hr6^EEqeM(VOye1QML#5s zC}>l^Y~=mgLsF$ABvSF2I{A_L?-aMi|u=@nOQKhif(Bm}wo-H(V2$#UA@( zk>}gZ=Q-(MY4KSm-7j?DpF{Whdg&i+`?r@PcTHmNqa1*|uDk{~K)Lg*^l@>mDR)g*z{hu~6|>Hqo}LH5IE)jhf=Owi{etJbBGk*>i|I%}fZA zzJ0i`)ycy`9p4l{pAg9q&v(21$i=KA5)g`qdB2k!yK#aO2t=sC zZas+=4LeSP{=fRHZ|f(Jg+M-SVnl%IWn>4Cs`Qakfm&FRDM~;J8bu;xibV7W%$*TF zz6_v0^7w}si^5KDnk1m02$hK_S(J$j=qC+8m8n(XAT*>f1XR%^ibSXlASn=vAtWd# z0L_uoloSOGDMZyWQwbnPAhgL4StTh%M$en^RQ^h}Xw?f`e<%a@b*k{S~NlW0q)AGJSyWr7qL%b0K!d8ZmVi6t?lD$w>XaPnEP>u2R zL8v_mVwoBT48({Uim3`6NSO~v7s>$!oxHrXk2E=ACnIiQ1tgMDKv57SBS}d$6wwXT z*uP!$M(m!Sb>*KsO8#yz6a20 z35sCX?hltjVIH*)$9rk1g#3`__>31cVg8-(LH|d;LLX&BwGvg1l_QE=>OdTx3JXe# z5eN||fZzp?(E|~edM@>pU?5E!z=1g{6Hg>#83z`f6}A|Z(-P3xTR{ON#5Kurcl_rL z5y?F~4HT5Y34bw@1bR|40Cs%$9XaI2Fv!CkyKrJjgRKaHNkwmo$-*xB5=?Wl5_aNB zF)_s#lx@`0M%j1S;YaCM@*a z7)pWl1%+&5VWbk#MJmS6`3v=PjT-*@EFb-A{w(oR9SU3YIUnq zr-_CV(1(2Z+Kxs3lZmmSAmm2cwqqswjv2P{AM>o$V}3N*tZ1mUB^!t)0_Dv zl3YZRI$B}c-E z@_Unk=X7nKIQSe8HlWq0l->ASNl_wWVZ{CPnY#Q9W3IwGkNzfPsjJcx4|f z*&*JEzlOQ#=|6Dc^Njh=Yvo76fFsY36b2#zo@9^_+Do*Lx5d33DH^lTlT;pxA_t_3 z_CN?G&tWNVA4+SVg&xyLuLT{i<}MZ?=E;e)@@gH)5}%Yr`%0?($)W{5K_&c?Mk-3e zd`wN9CTtn@l4={hRptsj1c6pRjv@>qf5FG#+Cp#DxQFsY?M2c#juHF$*8E7_#B2%?GySXU!Gg!!77C#WF8PBs89}!snSJu zlmoJ_WD(ufoy#B&s9{MM&<*q!IZ$LR}2MEr`e`2G&Y99S`zB^iCk z%yv1WjBGK}{V|$N^DhNM)Ji%JTp_UWF%Jcje+d<`Zg{L$ZN6G2)0mQ*m3txcX{1_- zCl*OD6K}iRoSZZ1X7W+&_aZHLa#(m(dA-DeS2ie9sXq!!(><=jQ zPYkpQ zS|S=$`IPJ{*$oEudBD(Z!IP5yLW~sZ_vH+-PNxfrX`` zBw&4+Us4na@d^08IN2iy%F%pR`;_gr+eayWTOj%mzyzeAA_Y2po0QN!2Dn@;W6b_PfW&k@c;q}WxZZR1& zVvklrWZAhE8X0D_9X8lJ98Dxo*qu@S>K#+h&l8=`t3-c~=Iq^Lm4r|fP|aVf5W*@5 zc%(tXiXsSt4vQ1Ah$@p!NARQpfh1QDDZ&;Y9|8d~K+1q=Q$zAdCUy)H_pFYQ8%>&n ziqRT6Rq>3n9MK9!NmhzT2^vaLhG?1!5JHz^Jtw(2a60ocpka~L0?2z~sVT9tmYDRUTDgY9Uyr8iKjuX-C{&|C@1EqV_*&nzdDK@A>>x7`_6`u zJZ-~wGYr{7>Gc#X2tQ{Nx0CFA!{iQ_LPeiba7Ze51Z8;4PRXIO2059S-bmyoJN&Tl z@69LtGdok4ZU<%RQC+d=wlKRYZJ>~xeB#1@|#qpzXFp!25G-B@l`O#!q)~VK9xD?7Ts7 zaE7@Bi?}$H_Zxyi;)Bz&1jNvms!M%kZmG%rh54Q?`@AridyuYA*hk+fR1bojBYrdE zT~QsR#}Y%@IJoH?1a*O;G;;jRVUY9Co?GrFIY+LKODyH{vPU9WBCH4VQ*r3QML|%I z#7Qs=1ggR_1VAuB?|{M)W3rJ@R-0&cp)>_m(WEJ0J-yAuF#}O}&oox}_Vsi-V9{fgiw+xC& z5JU!Om*{dLl;mJ#9tw1l2nwcICJ2R^2$^aKC@EngBqC{O9*4Vb^-$t&dXu#{`_qbU zz>0ESE8p9?3Y+c35+;F`0%zpkuse0;f^iNR#9opVR`%<}ZK9F2v{gp63GuBpLMqFX zh_)%xOfr=oIfOlux)Asd5HyEbwvL6tuHQ-1Rt7Nx6*0rzKzN)O%!670a9zd4FF7o-a?y!`X~J!$bIn=;;R6V zqC!ajnf_ZpH-q}W5gwnMd%r808DRQ;D~0xtSZuc>Fnj zuyXweAT|jZ^247$?CleT>}D&Aj%$_~Cp|D={@2m&%75-c-+yrl!t{y#=Wr{{P4~6h zTAFC5cb;&nq9V4REdqO2+Ywb(+(6+Q$V`zD2D1i=cH3ftq%U(0=*WMSEPrtVD0ll@=*;{o6PYD8d!>;{47Z3$o#7!cL~Cj3BgXp9!B2ae!fZv zVej+$Z9h@F?Md2o_K!Eb^Ci&ynGfS zrmJ+j4#W2L_B;j8Y!v^y96m7TSE}`<9#yh&!-f5>BiT=NwdQd%{ePA6i4pg|viS9M zue-XZ!Dq6cUYIhR&$3K|gTehIsfU4CGU7;wSjI4t#rxdqeYJKI6W30fZCdFynAVFH zNq?GqPQe4407tNMhtQrULOx^Ws=qJ`YX6vsHy08S-1 ziy@kg7!s8ZNE!n`c)#clB`W^;2Cl4#(x7quH<5MyTHID@Ft%d9WuN^lH`rHaHprA?oNO+GJup5>nTj2OX$Ip!V+ zesUGqMqpt7Qi=Kot{&9teg#L@$w-!2RR2*39fA2DgtV(lDMA#iG?X#qhl$*)$xy|R z5!?r}^8_&!F(99EN*{1^dP=DZ7SFwL!#e5HZKkPW##TuKk>G?r(DFhVSP;xroU`K) z{kx~|&YFQ%bjC$W7fi-tD^@1Z`Z4P}!aO1WkHH;e=1Yi;yqO>P>&$;&m?yu8qIf^l zOEgUcLoiapLQz8zO43p_F%2cDRtU5TSSA0BKBl6&Dw1KqlfnJUBgfhwzhfbk{>0<- zn|FJ$4Nu=Ei7%Ky{W8B~gZtqf!OXtJ67$h=*Md*&EO`8;E{w?n!W6 zN^ivTAA5&E<;Y)Z2iAU72S6UF1F`xquzc|_NM5PA@q1i7P;2!=Aw65AyyBJZ5rckLpEv}NmtS@8jPA_ta=boR9sj#sNlsYhaNcX4$*6$;p6)6 zq)f2z`Kq&PCE1QIbtb|o50kS~R4@d<=9#3sJ_5fJRqCK-gs_6f4xQ`m_6T*uYLd1S>@&|l1hvy_#Sy7fyRDUn}d;*e9?a7%MQavuaX&Fp@TY6 zabbP@{2M79&daTp(Rwu)f1yC=_{;X>5Q2XPs$zSKot|=|l;@k4T*Ng6>Ll&a$iTAb zLtu};mD$TWT^~BtoaaYtnpxBi)yTAv%nv)IqU6>f*WjrOtvF_eX$b2~$5S}Yj1R^< z4zQReI1+CeQPIwsJx8PR<7q|!=>vX9OsCdAMOM3i`4mlXQTGe2vQ_gL+3$E`L*nL+ zWz4J4y*on6BKa(~7H1hIs5EL$ias0tIrjE+AvlD2>a4VV#>d9P#gF zrzm{+(PhUrQ9qB(M-Ra>zG#syBlGJ;>U3R`lkN{LEAagkbV%+Lz-%}0onbNek@NHD zQCOEpU}~3EMi&^Anug&(kp-l#eohV&iwU$ar49&nbB@A)9JR;uJJ&L6M;W%_wXbWk zA}O$D=Ri>lOsOM^2x=n?No6=$*{+X-n>*AVZx+-#NSPvm^Sxj3N;SB3uDnBz+gh+} zXv%WUyY%R`2q>%^oU9)MAlN>Se_ye^!|)i1N(1toNM*(XQ~G63k|F}D8o>P8)AdP_ zkIj&9TUM>K{881M$A-aNF%#$9!|RN&ul!kcowUSuj;KWCLug%=jk%DY4pipP2R#Rk7?6@1E+71imnbDDVC!fsT&} zK0;3SC-0C4#Emrjsy#)J#0Va)d&$oYRDV5ZFhoLnsBr&=2RqVYt*OO{GREx6?zleg zM)ul7rLrw=a(q6Gk@1B{MVPG88;-)Z?ur|{vV?aY3S!KS3sKDzu-8yd)LjlZzGLg(*yoRWf1fd|9ln$Tp zhVT*haHxi^xMdXrWG8eP3-j9$28axTA&7}0Yu}kn5=87}nW~bxfxt3Ektjk;j07;i z%yhzmrJ2?ll$rpFl!bu)SPe8O<}xLYGGdulNsM-wZ)C=&O!AM@ADiu+lu$zpB|x+X z&ilpu7)`d>?D@3QOa&%zT4$I=$12-2=JEf09%l z>I_hk*N@9QN$U9{?twjtJ9>QIFynbCP3f=q>Kz<1DI`Ig z9uWkdJm*d!*g78P*PE;78xZK!c^k9KC!!BI&IEY(jPKV6kGsx4?Mmc5A08cu?>n7v z=ToOjdUh>{o!5XKrRVAKG*jO^I370Sxd%e!K4kUk+?a+TPo*3j{7FtiA{i2Qu;%CA zroJCEbhUSO1D&V`}j8hZQuYSvzFuR5pV8leo%(R0@l#0@jNKz=0F@Wj^AyASegakR- zG;w1OvmR#Ld{gQssfZw`Dyo>KN~mfj3ISr(|CM+8>J7#HF-N=|DXBfYPFh2U+PEp_ z;{F9E#{6l$ZKHSW%+@!Wu|Bqpk@2nYbV*q~>o;Y#=hmY zwH==VsgR3Z?wNT5v(7~ir1+bP-sk9$0PRO074$;XR6S4t=x}W3jl?m)&r6q(aN|Km z06KK4ObXB|q4&1B`}0o#3iD&-ra#~a+UL23q12o$jQqOZjb3i)YhkhtKVTb%D%~k%|f9#Ui9B zXjUM9%ely#o*46oDd9Of^<$eMTS@%3KZQ9?oT(ydJ%I!9QwQXQI0%lt=87KAi1pH( z-r(&FV2;3uiZn^YgCxi)dNcN7|1h8j;6A1E8Wi8eAa50ZG1uc|?;KGR^V5+*zytVa z6+E0Lk7{FI;aDo(`bj2}WU8mLVoU%R7Wmws`j8VV;Uk_Yt+6dZ635RfGa(9%H8 z!Kw;|hGJpq-Y$Y;{top}^?_#*7L>9uQcj5(`Cwj_?*}I1ut>QL3yMV%0+GSKNk|RA z++kWC*;H7DMq8O|K``bdD~LhDQ2}x@jN)C}1hO&k@XxN8c@L0sVj+)P1bW&dnd(SB zdE@Oo^N|81z<_AUKI25u9HeI%n5dzWlZ$o*#oQs14q%4EH9;y2Nz;UE!5;qSIq?Q) zq8r_Y0H7)OK0Z41O**Jb^*Vz^7$618x>49H3?U>ZddPu3M()QQy&btK6phGkPaGcV z`<}q;w0nTm&E7urdpWc@=|R(iN%^4YOlaeDttW*|?{3Y>-i{;4Dm2z2@;IEw!hA(P zFdq>4J=#7&9{KeX-%r=$mE{zN*+b66IjNGhE|myEl98jW*0dXKQ!&)U2|(K{+KiH6 zXtxk()~itN(k>Ou$un@uD%>LfHqdfQ<@Lnjb=~$j;B<@Z^qw1q_m3eyJ4YWw2ax;; z928`o5-XOIHb#ha}$v(Q@7+o`(SVIzY?L4pW1J-t|=RA1FoFjR&8% z-SnRg&)9sK`nY7D7Z?a)55)c=5Q$V|WrB!`f}&{zf@TPagh~V2di&444M3`U5KVft zzXyW6&u#sh_J;I0eNk@u{4oN&{c3U7yu|GbNOUmw#S0SF-&y7ML=t}@k}9MYkcFWY zLIRU2BAW=OkqDt&;Pdo7Fn@<|I0*+0s*r)IBw<5MCIpcwC`!0WVF(}Szp?grsB!Q& zbAx`%2jMIOj7e6-{(dkEg?aEPPKw>l-o5x3$4T&>!sh;h~pB@zNWev(5<*S(DWk9pOeK+Hh~G zdOdBDqKop%lvG6w60kr~M!Z}9n z#39?XoAxGyk{G}dv5J#tR1*JB)cU{8lll4V;DUfQ8<~*c5}SA>qql25tuhLfh$tga z;y8zWbdKa7g@JMKy}lL*I7A8v8Rz)L2z4iSXk%UjWW!96=n(8QZtw*%X8q-FE_ zzynMvtQBLuG#ewc;vU)2296kGFONO0N6(^+&3^{d>W=)xC~88YpNX;hN%+Vb33%{T z4k6GvN}!-Dzz8nlfT(VN7aM< z@FV&Vlhv+1kitaKm|f!b`&o}n!1A!~u{7Y~TbL2i2gh?fVQ@JIfI`6_v4*onM`soI z0MB+U6bYZo!iUVlKK)<-@Ib45wS{XTelerv$9@k5cSfZ~=>B}hj?QM=$)#zzy30>U zsOi%dTjHVz-k^HK&lkA^k`Nl>6r=)79{4aKDkva`W@;iuDQD&^9T*M*5#Q0$M7^KU zN^oi>;|x!>K2h`BdKyb9X&+u8F|qoy{g=PilKro8UtYPdxz`>@Q9_MT&)j7^Cxlmq z4dWUmp?2OF#CA+ZcpOfhOv44_8JMvQfW`pQ5RychC;>UPT+}Fw7CtRPgb4ytoSg|D*JXJSNCZg+5j(*1tio1g%9Pv`U`I+y zxG{_nBnOc7R3K(NjN1I+r|Sxh8>TkN2L38 zVS++>1j1|iGcWG%G0)w&pAh4J9^!iaS$3gAdIUos^-XUK{?vbQnY^|jwqH;QAX7{d z#Vn-314A$}QqV+HMHLlZ_76sjq%cc9>`6&NV#Q6h2_)!iRJJtE$R>7K7fT5ssF_Hj zNEw2Nh_#`pA~p|Yf|>*<1SK^Zn^9?|q?w};vkNtGFoZ<~Bt=m$RFORe{Dv@EB8Zx3 znn;i(KcD#vPO1poBInB$=(?j@W6QR5RQuK*Df^WA==rbTRn{^-%I#o&3lY)IL}J2h z?#a~U;1{qon8AF*_XBdj>1%@-Gmw~a!Ya{8nc?Spb#vey{q(~2KiC)Ue8A_?rkC{J znEb=yVOW>ZxAsRAfa4g(>AHog0>OQcwtjWp^N#v=){a=h`xY>-l;gPor)uw;LID#hUGl+79iPp!< z^CHuxsT5&RHFkY z2cR0_hlH^ze?!zi+5GzRI}6OuV~SJ%BBTst5`UKO^{gZOg~@}4N_0FVL7}=S5V6uD z1rt_xgB7t@h9EA-5bas4vd}i{TZHx&(IG{S23?a-nn+el@(>rWl<1Yf2PP0z$487YGnRWzple6<+(tfkc%RV${Rv zom?y#a~AMT^p%*tfpQVc4a27p(tnw-+0t-BNs^TQgh%A^PTslzbM<4Rw0iHsFyEMd zubjYnyx`>W9%=RIKFcQ~q=U~J3}gI7<-`(y+4)~e`7dSsA-nynp3&o@7AjN>4}Xm;8DI^4Am7>w8E zFVFi;WB&v-vAN4B4tUA%nr)=*g3M*5=gY>N#h(fC!qq+#Q{hejmG(@TW5;~M#u#^) zd@G8F6R6ij7n9oXC)DI}3l zuqD|1alyT}?c>35E|ldy9dc_MWCQ|jj} zq%|6?Vv-cZ*D?{vb^8eJFw8J>sGcy=CIb|$!RgtLzG$T=xH-vE!30={e?C9NQHr@H zi%Q#i)m5JKMOYGXIz8G`z@diNkjKn0nKCyI;R()EZDz<$578{zZ4p0ONb;3c2&ZL5 zP?!ozNDrDMyKFpziDBQjVkCOvG@olbd|$Uwuae2h#NK?by{2``81yWDq81_sL)@30 z#Q66Reo}PN*RBJ>KrzUkD% z5>*g2RTD&%kw{fSO6`WqahLCf_rUO1*N+Wo3dMlP!p8$q?o`(y9)|{y58F_ktF%CU zd?q-F)Zujy2UW#2H|Ol1k|cl}Jw}380Ba0sBex$oIy4f^Dy6 z+;>%7rCESyZ$DL!w|(k;IDU;viIQF%^RtBzha-l(fAw1IvMLbLHdSAk7K5glAiTPL*DsvpP&0E^N`0bgJ7*4i~ zp`=4RKPJZF8^HUv(rXEuETSR`NTPyCf>wbdK&Xc)gAf!$F#RFO9z8{Taqd1G4oU%`r2>J727>rD?390# ziH|1(QR_H7+4rRGCe%7< zp61dB51#R@og30g>=vtb1J<#;FU~w2SS=9z)!t8gd^gL;Kycc;n_B58gM^9bUNYNOQ%+b;nqUn7D1(8%IMznH(tLTnM~Sxq34ZAtaQONy03T z4hev$=`qfByRQiHITuvRr7OtM*wAUjfjiEVDcnaO`q>1)p>2+e3q=%DWIJoXJq+RB z!$7G(fid4kv!tb`6i`-^q63 zFGB|&4s}xvPfIo}cx|?fPWh9mQ^?UwSSb{SGZIWhAj_vXZ!v`kcw^}lJVYgt2-YrW;DGN=1Poe1EThG@6_RVmERE0B&6snza9*lJ=4tM z3r{U6Y$pVz(BU8q1Ojpg7Y9gU49E>2a#S=acEQpE6UKDC?|7VsA?zn$Bp@VqJ)L;5 z;0_boI2Q?%-jk_{BaAdTSdMp!@+nRdH&;JKm9T z5?~^Tl;O)dP%3H_X%Hv~fKXk79E{bOoI_CCW3MJTq{yhWAME2BLMwoj>dJ}|$D%F}(nHqJCh6?z3#q@{K?ASJg z`_5c>$<`udAc&!b0wE7c6-*eW{IiA`kejl(CZ!`}Fp&c!ElWVjB~>vI2dp^<-?qt3 zKNX7}xWy?CuXg?2ubt+%s@^uWr`4?{nUW-8#lsS3IOk2?TjyIW%+ztb9SJ?%vPk|) z98U!Oy<=u-+fhv!+0dm(fP!L9oL(sUc6}lXe`<>gw#hw`7daw4)mdn7>r4R;BG+e8 z2b6y8VGNzoj8sJX50PC=iT+C@2lWU}6Zq7SIQ;qhXWiBetJ;l!8(K|9P|UqEczo zlTM)wY^xKkvM(qbQlpAGwR?*R5LmAzx4d(LE`G0N84LEC#!A(0^I+rBhTwwbDb}uAk zIC3O2SwAWQd8oZ%P+~+0jEI8@_=g@KF(3mH%#;g4jVij*1-%sslhs5+x#25Q9i5Lj;X2Ae4$4R}uvPQUPoxgmmZ>sepii3Q{2`C{bob z0}%xF5(>}+tV>Hsvi>DEwJs!xX5;fT8;E`sM+*{arwEo|*&Me&leF-1SAxuOq0%n$ z7spG>QL za6=T%6NEgAT5&=Ucc&$&~P8}TXeQlUFggK0QH6T!xB?R z$p~Oygr+bja7cMBgNZ8QALQ6mkQxB`e|E?nNqbnyypJC(kLDx}a2=H{q++JlQil-G z|IP&ZN5WT+0yJV~7)RR8!x8)T1Bp%{?2*V%V%>$xL@5LzlE`GQ@XUX4R4l5>fhcP0 z2_!%0yZ>stV<`ZTmZWrsqEr(a%b=s5?LULn%D+YZsXhnjR6d_PlE{8qN;O#Rg2E(Z z+lzy-i2fK~dLM`}PInA(T)QlCnV`-N3R0Jwc;KN%nIV#hT0vq%rVNZjFcgIpG=VZF7N{y= zDuNtH&>=uRDHx@(jCl6l-a z24Wa4ShB(zA~-%2L{vUN!P`CnJ)c$sfM;y93y{DsBaVikG4Jbc&qMs#e;9Cy!c1L9 znv!GR)`E%GszeE<09kAYHYw|bQx1*iO@I5jx zS*pTiHq?ncEi9jSrB4a*W#CIh6v$~x9y6my2<$YUgs(^8HzK^@k<}g);>aJKvTVmT zO(_4FTv(hdcGfUsBuoC%cwd-bfgIp7S^S3_dKKqbj`k)~s;7l%;~n}K8>$u^ z?J41h{f$YrP1w)m&O3C{H1Bh0LK^OhNQ!agZhvoG8h6%^3Utj2=#=^pp-mKdFOWJt zoXhAWwSIVKI58!AYa!`|Ekf0>a;ZC5XuYLb>*(8=+m!U8^)l(v*(hc_0XTC}|Bx#7dk)uXKrE^G~;Qu5P zvPc}jbf6f1KB?lL)zvMyrv^d)OpmAYNs5KTb%dGxg0SEMWKf9)A&W!Gi%@V)BGIFvce>2WmdWwU{zAp=5apwba` z4SFNB6(j_4KY|Yp&OmVCQoz7O3qr+0%6b~;{nEc8hG>zJJwx_U_>_`KihjhP;ZiA* z2xwIEWDI{Pt$j!;+w52M{TU?s(!ZLiQ2$mRcj%jyf%lxqd!=BEGDqYu!6LqMU+?$5 z-?kAv&`_X6pI<_Kk@pvG#R2X?JkOc`O@JNPJaIA?+NLaIS(R$h`xhy%W@Txa37D^a zLsV<_KNg6aKBN5o-6IX_Aop^DK*!>TWXXj{afnQW9TcMyc|$*7JKxuzl5(rAIF5lv z?%=S6zT_z|^l$J?!_i7D>37mKVYm$>9L_M~G#be9Wnn9dm}7<}9)3&t1lyCZ&HnCW z!QwqT2Sy3m1rJ_Xgb&RIi%pU^N{CPz$&1mk$&5>PlNl8EfPpmkhi)7$NRjN!BMOi( zW?6ma2Ngi`HKgGR5|W&y$S7EZhytjkN<)X^KK`Z1f{>&>$O=M+hK3}eC^P|g0Ysg{ z=S{A^IP9RJlN>wSit(i*`D4%Jw{!4by>(9yJd7EH{rs9Dr_{Qsm?O-*j!el(5lIlj zRK(B`2p$lfgEc&mIZTx!i~=MgX$wbK*tkn5pi%mZG}FY%j^icamGFa}P(W{(A+C9n z&_rvei|a}|GYAZVXT}=g$+?%1atdmwB8Z}vTH3>ziHG2B!O$VuLr@eV@E|N@ zRO#F_p%};tbh;bScw$V0g@&V zg6INRnF%0bICxD`{niFxo?nP@HZ>L@m6$j~`SKq=4ijv9WvjgAahDjCpCmJy^*hR| zK@mbh0K_TxZSMjJoUFtspbCi+AgTz3s>TDy)`Df2qlT8DE(XZ&(8r6X}w~2>*o4>HVKg6p6Nj( zc^&^X`2AnXw^S3G(25F~bV=HxhQZMI+}!yN)crDYpPk{0g=PlQbj$(l&L)&MoQHk? zBcasM6#ksbS4gN~So*$w%}r?a(8v}Vo!nnTj&>T+Tjpgkb$CcOJ*egr|^dN zwVdgYvXxp~*X7>ZS0o=oc_Hu;I#b=CyiQsU%#Abc*}w=>GAPf$LH5|E)gyTyK{ zIn8>JeV(lN37e})cOOYKa&^fc2m{Xx2B?fi@UhiW8E55D!qhu`TU zRMAOERHOkyQxX+QF-V8z>%jRBhFB2*QK+*TF^rU%lLc_Znw|LjgY2+>8nVGwXqYWI z4G805bFo8JQcP4!0WqNdaub{b4v1JyCXu2bfi5yS103^+2PdC9&S0X9vI8UI+uT)0 z$FG@&5>yldcJaQHL?Fx?0vHRk70G=dFbIkkTF>M4KSB6C%M+0nb}KCIip21c>Gv7O zw}batv67zP54w87?HK{%B_#;VAC^6+5-C(BiV53%19&z!b*E4?0(2t?sHlH*4#bU6 zRVKdQVIn}}i}=?L zt;uCe*_wVEOHps0aF~Xi2poQs<={#|^F}Zv#ugJ#lwguY6lRSp^F276Nk)_5BILv) zN=*<_6qGemz*17uCg^#A)4ao%ftrd9ACLEa+e|SPVHp$mjgj^b+W|;55QojmC6CMD z8Z;M-XTJv-HhC8hu)+xV`0ro9hX@ft;Xw*R$NbLkWWEW*%v4cd?K33@z8qT7wo*Sr za68&st+NegdV${rHVN0vozG%)kH$-dIMaY63n7U4NTvmxNszKfGY~5zr5*M50mTn- z2cCnq&?d(GSr0JpB;thg#~g~pkdK=jf&KEy!>7bWoCtvr!4A&g;i|F)Z&FN?_7+Vx zWTwm=KUvPc(FrszA=q@}ZZ95Oz@=ZU!;XVdr|JTFuwE>!PRAe|f$_&+9Fe;IFXtMc zlWCnXRXcWLA1M*sKV^Nta~_iNQR$y-)25%{&CeofnOr8afcb4dwXI5HeS%OO=k(D~ zk%~J%2QjpM3hu@z72 zAlV9_rz4F{LLw+4)k#oJq#R*Alu|1P0U1N|NZVpCv6d@KcHvBP=8A}D8Bm3TfJa-8 zA&YG6o8^x8faiqLQrgqBG$t{OFgGT>WiP^u^Uo?I*qW*QD1nIUzW zYcXQ1b$YbYx>p8=x=soO;^feB)`Ec1DJ9^$>?72VyWoBLJxAV8IfM@b8!H^g6i*~f zE74wK3B(&UL_;LS78404LUJb&vIht-@u`Lm7Lp<&Dxjc_H;(|&a&@8+Ak4{^v(5xi zK_MN2!eHQj5PG{%G-R-7kEj}EnB&y6N#IS)8Vv^2$IQ#DZ!SMGJ+ogGO8cv_sxW@k z%-(Bfg~t0yik5cB3pA_@?9B}frQ-(2vVLTTi1=)p?GDQL%l7i-91?Lj)_fzWQO4qR z<)^$P_L0%jI!%dwWdqQAUjgTyfbm}!p~dG!_K77G2=kg(0@8vqLgb5JA~;G3s)T?z zGB2rkrx4vXdI6Is5FViW2fR-Y)qpSy@R>)S=1!B!ax_O4ZASgfNYmYzFg?E&I@3`__zALz_~HpXhf3Zmtw{2JMM z4n-AV{q4Mz8*KY~Ll=>6Mj;zk@*;V!< zVWHH4h!~0jf`F1~0uoo$9}GCWB$-l?&zW7*sf=NU>_?KhFAHUrm?rWj)<;C!+nGL< zG2^UpGiODN4yxDBtW6eH{0wvuni#4^i>yc0Gvq zJ?4#Xvf6*~!$@{H0JL_WZ)2T8mQn9OPT(o0I2X!rcRv4UaDT_w&%3!X zwSJk8bTe8WhY`4x~KShMg71d{?2eXXZE2&yAwq$|P|hby$2)(sDsH^Ys7S2h@He z2X|YVW+hC=6-NW4*>dKpl4?v2RRzr+K#(N07$id4ouubvMur{_5W>@>@>f6yO?eaa zS<*Z#c^4VAg#7j)dtPS(#_ zs(v2V%_#_QoCsAYDI`)@h9H6h7$qPGqT66lim-U{=+?}kX zaHb+p?)&mdL&gl}RbG0#`%6U=Rz*-`t1ssSs4V-X>KuSzP!uw)2}LXGWAc#obDBQk ziapdC^?7S|FEbn(EXl1W9{$`NpAK|Ig<5p1PPQU)jKKc_kq- z&?!Mn@LZ7NEmIPod31EfhFAzOv64qflo2UQOhd_2Q3`g@6tNDOkj&6T4wW>B)Imqa zFu{8E9C(nhM0q%y+yMko5JC#KcsPa(Mu7gC%kNGWeKf&5sB8bSy{l-UV(G9(@2&(H5+KHBn= z*40r(5HgT*IX)&n-bwawGw^`OIe%ulY)8HEk7j+T{;R-}Jz(g|dcCy0BWoH>UyI(c z^vl!MUcvg!vlKc`8y-fU>CxP1i-ku)Cs71ML;TO@Z*0GV6cCJxHs?Fn^D29*ta%hmaff~dk zmHI1YVg`I9%piP(^x?pxl7#Wjq_{YDCl>Aw&pf~`f5ltFAAa~8`T4JI(XVmA&mz3& z9rBmac?&4zPLOmmqI?^?MopLz&Jm7-&j@kr4~w(fB=qR_PY;w#h>GrGip;TRg&jfi z@!*8sB#VLgdNJd|y=TOGqk93sA=x?fKBBwH(=O{Lr63f3DG~r0jKhsgBYIy!Tk#|%pqRnRmaRcA3@V6 zz$lT5BBg@3nvjV8z4R&c5O+emL-7;XK#)kGK_nqHGfhDvt8d@LQ-m~dgTbJ2Nu)xU zI)-@(-b4a0qa$k7w$}P}*mFbdB|JX0<1}AMI*|4fm_iA;J?>NZj(Of*`l^Fnh~(%CcFfU&!Nmt~s0J_#A#v{|cu^GY_&Fry&Uu7$Ty>538(DgZ?4?;t#bir_sScVQJs@~MTjHhR`@B9oZP zJ>FPBJp=&bD7_&-Ld3uC7 z8ZklH45?`07!MibD1QMtLW}`~H#tYGg-|>*Dkrf+nSb=WLZ{AxtcBts+SZM zGhs?*sF1Q%NjC1PjIcyvAjJeASWQ(#Bt;~E8b1W$MvdjF!o#m>k}W|Zx*S89%nMt+ zil)KKOa15O34n=0nWQ8LAQgVckFK3S>h$=WOY*S}<%8Z&_9&LYZMND9q*5pchWrW& zDPjT%C>X@KZ@51?uMrV@3WN-z9fBotKrs-#{S?xM zlt*F7^dZSqI^vFD>qOj`k|H8xi7J}CKLrogp99;nQYX`UA5(f5X%sg?L0*LSjjeVA z8bei49y~dK>tb=@M3%uPIlU-gI!Q!{qI=Li^8G{Sar-B`W6O6y=g9!>E1hjA4%#s4ktk^hni7JVVgd<>8Bzj!$UFcUQ- z&XFQ4&Lp@%>YOMaI}p*b`IIRl)(EIcaVwfFDrrR9EEN+J4j=~*=nWwdyC$7x0$8Y8 zQ))C+i0lq<86hErMOa`~Vp4D#@Z7kxI|i8wQj9O797Xzc`#yXMS>MeiI7(B^2*tr2 z2g-V|PhZc7pb5-83li^Ukd`QPfS;S99wI*};-Hwaj-Kc+4FL}%c_1d}Xao9>1=!MV zfu2MzS(xK383CjzU*=7}4hHAx=WZ|#NL+Lr0q{13DEnK> zI(@mik-F!Ly#scAuJ|6f{okyAR0J4z_iZ@alSsl)$Lh`)V~2-wMw>hq-1hD`D~tLL zCwN5=#62X4f?Y8Q1tdXg2hT=KXas`>KqQ#}O(C|OZO=a+tI^fvxV7IXy5oXk*Wvcm z`e=U@1lGup`EVgc-{$YsQ5#zBEmcb?J{!W(Q;y=X2}Z&u5(4 z$~s;W?>ipM4$H%zKI7@@!0^8NQMPeYzJ0snK}tN}7Lsky8qAemB*4cAm_Y3%H47?I zC5wvBRkum|`e*AGJ#Vd=o@QMID3t=Y1W}Mwr~YD&zZTy#FUnS4#eg+5r3hhHj z-Sw4r({QfXL3C8Jnv>Ec2E_-})j9^iLjY#XJ{KmFFc6qz{LsY9=RG7&rY4nXwb_oy zL2<`n2Lw#KlonYonm$ra+BrpIYkOsAuTXs|+I8Bed$XgT2-~v!rRj`LbuA1B zCiTRT2^g)=^Y+blj_$17nHChKotU*`)sB80dh$V5@m&Y*6lyDG2+FilXn(0WNQ?a@ zr_*1u6OV;_;6oOadoRIp4ic1_Xh>xt-d&mGoVgr3H)-%Eq`D;0IyS?ju7;4=swHDc z5`)2R31X8kao_M-`lIvtvPsUn$ocN0#fUc^@t012l)`GPT=TDgc_z8u&&^lhuDo=4 z*K&2i8%L4|k+?iL{S~7M582%71q>3!+3*uyCe%_07S^MeHWs>OSdeI^LwO&sQChDK z#14cnOoSza2~0sqs+g1L?X0#|!5h}rLafi?v(Ck7RL`tdK?0PvPEDAmwj!wCl*nMa z1)7N`TT`r4q?ngMo5ov-?lh5P)HOGbD>FCgHq#B&!c}*4Op%gnl%zQzp?>S~ZnJAS6_|Z0`DX$PC~?y%$pMt z%n@qPtPKRFBNMkBl+LavDg-0ISEkV^GpO3zjsiNi8xdeCL+mzhd?RlUKGb_7B|BuK z?vuw^w3|zW%t_TLgYt;r}(<7umy#kG{jmgTeNS2;%dJB1+LA-&kf2EQ~~MOl&b7GhMmv zAj)a6;3kks`iD4zwvSEic`W8p9A|!KR`}je3qCxP(ao1yBa6~kL`>+mm6?SKy`=&a z_tofgUM9F8p!}BeV74A9oSohQ4EKi7PC~>6-NZb3|ogSlDr!4@7YNLzjF4BY_4)HMc;w%I6=F)~B#LtfYVraN52 z!5)sN<2R!3L3(HIKYDZMwy9r|}@n zYgV|Mt~L*Aa8FDJ#cC!hT{xth6JbfP))6r%1aU^urzebBorte!*l+441;7dc$Hupk z3MSQUMQDu-WfwbMvOzAb3Yilx6hTqz{o;sw3nmRBe?j=HR+xk#v+6C@QxRQ1(M6@E zqH?JDEuEdZrs5U7YN+hHX`og!zPGy}4P`P1B;!*7UxV)ztIxkXpAC-n;O7RW!X|HX z5jH6{43KHPIkHozi)uJ=>D35nf?t!ycvk;yNAz!=9vu_zjK3zqQH020^ti~DZM3w^ zGjQJq1{sqX3iMER94g#x0fn;+&)RDAA2=}>eHD+d)8+AZ`Tai;zDoR?eg3Noge-B_ zgulLB>PO2?eJ7jW>|9#8sP0funwTq$EbJx~os27lSV-^)auF~|^x})@2hohK&hxio zIyL)=9976q?xM>Aj@5k`9WUJ`g6u3tp$UTi5=Kyz#OikIjB(z02F*lJogI^14h|Kk z8QH{dS#P{i1J3)1lT^KtD1&&Kvv4Sxs2EZPdCrbAT-uiv+*G~1xS}mmG|Xo<63Ya1 zs(p}X<4<~WpURM!L8de$Y8YuokkMRX@aMDzQM<LliPuus-c5e?xm_jK#M zzm2Zl^|hEqdF@YnB%5p6HpPz#PA}U%)~jfuR-_HG7et{!tK)3mhDjRv2+~oof86^7%eL%gS9aNp#WIR8{lh znDHM!l5=yi70ya5M3j^2ChQdw$h`Uz2O2+{!IoC3r|q-n9@E*Z?KoUVI3niceRjL@(;V{*bWjGB z92nR9Z46{e7aWE38hM9!o-$Bm4iX-E%$533`(MrWe0KKk&Be7C&9!4gA+%~V&FFSH zR^X5|LiRQlW6wr^JKg!7_a$TAtzYPW2~}kdvDjH49lM+p)Th-PB%+{z%*7v{+D7W| zRyL8;$bG(XpNx)m4_6;PljK=!QlVy&QcdFEI@WKopgo8u`cu@s$i#MgIgazal13pu znZc><_;lwty;Wl!eR@aHKmPFRo^h$ zs?}Orb2+P5^nQz`UIqzM9@jW))VTy22+@QhDgf zNJbh+`_#quJu$GbF1He>^__fc0z-kFp9=fO8D0lpG*&pplRcKpqbxV=9Q9 z!p0&fV+$W=O|)$Vn~t4c@^w3G+<6rDn2DcHmk3UQ6uh};5k%CgsXz*nO{M2IXOi{~ z$k4r!OsGu>nLsaYd5jpK8>Bw^j9rdPYle|X97q`WF^}GLJiedAmsm>=jfO1p)|15!qmV;}Ab z!@6|x*9=4Z_;CCt|LT(#t?P3D;1EsR^QK)D{}nje6e7Qyx9Q)N>6sV~7eB7RXpTuF zl1U_zVFe^3^v5S4?t%2VaOHBVzlERCF^d*Y>y#CO%2>J0`tjLr_T%KFn4q zbQmHu1tuX#h9ZKJAc+kzCM9JsBSy9qMjf;uh<@tfFi{{SP^_?b&}xbrr7pl%B7&1j zd1A4SK}RNrYGVB_=?&EWk9&mL2Hj*ebOK!gy?QNGcFIDYo`$4pmrf9kR5I}m$b zP+WiK!GaIo3^;hljGDr6vB9$@0w_rX1t?E6+q(wRRH+1kVIe+cKs#}4eRWja%p30F zQe2ALvcMuOEbh9vF49umtw3?7I4p}xDef*U6xZVJ?oM$l+Ct&-{qDK{-RGQ4CdoUQ z$RwGZci!jW%BSL3=T^-(Jf&oG`0@iLKz8K(o%)7y~ETTjm2J%KgMMv1GKO@Wxx5Dx6TjwCcrh{P{Acr$Q9BKE)- ztIU{?D420#59z2L9iaOpwvKO;wznGRq=ZG_b^vQd2%180BN2ZuaJ?fL+8BsXUKHw+ zcF}l_-x?ap_Z*;X{~P)x{A3Dp;2DLg(!rB5`2n@*0} zrNumiT~_8q_N&Q+rj@5EP*NUFDMd7d^1Ll;$H-O1VQ&9aj=xq(teKMk!CZowXZhV@ zfy3$X(i6|k2fDVxA=y8NxwYAJY0m3Fe~vKS%dg2%`LaM(s1m#d9i1b&P;ycfQ~bgV zI8{eCUme?D0>QDWkyZbk^=IGX)k0*SH}^%oTNqS<(WdphFWT%?@-egrdp+6Qx>IeHRy*J9`heHsxpBn1w4X2c-VRP>4t zEkMqprBFOxTz%Chagu#UO-sD5)xpyefo2q=+jr2iKEHiAm88=!j#)t_$LS{|O7nQX z&^mY)95)z}R2$|RZ1JH>Sn5oKMPwf}Yl|b*Mw%5`26khGQT40h>`DgzD$3XpLLE|y zr#tWTeP+oOr2X_^H`9ZMgPRUSb4GF`y4l80a(_O9a4w!xhS|O&E$j96eh#6$7qab* z4MGd_?JT*$a9q{+d=|RO%1nI5_$FWckxps}sc$7HIYKq+SA9MU8C}{TYYic5p@DQE zN9jX-$lIr%w{N6@yCzv?goMK~l#dv?Ua6r>I@+WP6O3khgJ)1<$vs;=Tn;WT*R9-zY7;T5 zm@~uPaZ8uigmtTB#_>KpB!-DR`tA&uBFbNIV1o=p1@>V&CPgx~ff89;!q!Mi-<#mo zhg%iMLTUodw^cu_Twz z?Wd*Vc5-2(@=1`-b0rig$i zW;3%(Qr+i~NWcY1M#u$Pkg3-f3MV0iyn~#b{&1urh*WW(PiGqm-ma;_qvB@N4tMN= zLOav3d8#7#LIstd54TsYzR-J^h5bC}+%Wr?+%01x`6s@W z&xWpbv}pFE|cp@$0|7=B2V zy(1r4y)EMRg{5`nS{*fJRNk4=1W#iRmF6oeorYn@SUsz+3RgKr%T&!S4xHK{6V~qN zR#P%VY@nhIN>*)AaaL*sKMg)dWIlD&y$i8iaM^Lz2V1#>4ov)eMRWEJvmm>}vdXB6 zT5?X|k~Dwy=bsPk2+>2~jRW$JGdNvPZb_R|@+`illgg@0O74fFl252!t?*b2se7Xe z5hS;f^_sXDNm>}BJc;FzPpoqjND9v?T@F;7C*Uu7qZzqQ8#-#obz7 zN|(LFN(dyhU6C?eFiL^7l(9*Oh!J;uvLPAgF&jIb9?%bK$Lk@57=HK_jHjj)bdyP* z5|QQpBLZJ_xECxxCV#{0jZcd6$F-#twk1Jrh9nXL-|JP#hPDmAzWMly4eM-|CJk3#w{U!0@%AA1w*95VMTipif#tgwyof zHg1LFKyVd?5)3(mHkbqj!;h$@S8y|g{r62rv4zaD;ButkrYO=>SJt&H9$!3+>7e4z zRoGqadg0+`ToIaZ_a6xQ+MQ%3WD*b-AtO`oB7!qM&aPR$xn%188z`|f_!S|cle8U> zp%+zhGkv^;{YBDM*z&zpCH(4D)Ku5SPaF*k!sZFa8%JJE!aqJSY2(^QxUVixW(htl zbX&w33+=P_Yd)axxpo~Ce!;8XV;jnI>?&Tz_&pg!* zWju}Yz93{M)WB7CJCHFr^2j=2D*~UFka|1((-IxukH!F>ZjgdJjDm~xAQE1-JI-5r zr7{^KMPn8zBpOFQMT}JY$(6XqorO%lM}O%l*eJ^diik3&G-IxGy`S~WMvXqexMdcY zno5|Z%Z#x=`+#`U?Z_y%p=EN!F*zi>?wy%LC2)MQKV$YF7Ct6}m-k1eV`7lTeh@x} z&A2!I6Xg`mf~#gAf$lq>SMI}?V2B44k}n-PGuz)7J&F_}^Tnj&ZnRYiH*>L_$F9E9 zmFJZmF>~c&cfSTfer+a&*xKt#(7?#aV!=n1f`HuNCI4vh)GI$u+4T2L<85gW9s|T; zy{x>cFnAM^wM77fG7t=+_q16YIOWMK+-xY1kNI{kv6SPwZ6r`B#LY~bXW~MgrRZ~$ zba?44on#ae|QQZjWaKa}%*G{#RdM&RA~+P1PzTg-M*22S%Ad^I721w2<@B+6f% zX4PJS2FOZyIuX#Gw_yZIhMd-Ough}3gf7U*obz5x3d*8x^bPg2PVj4TQjA&!mBKy+ z7XId-ud}l$Sv$ZXZ{+;p=E&2OpIT0UCC~e@$92_Kx=d(>X@)taLZ^{3i0~y4^)*KN zl24+VC+5PhZ*U@-NNH#TlUcgqUr6_l0*BiVbwWuLVeYF_&P+=bk#6q_lI^#qn7+CV zpEN;m-xO|Z%SKZ(sw4Q)K)VR@(@y-$1ea)qPHDQTwqd#q=u<55^V&x6>v%8 zOSnQ8bd)oABWp>NMQBLY8K_Xz(Q0_BbxdF4>T)OD{12>-#)8Go-tL|slm<>!RECf$ z;?d&S$_UCd5lH{7a3If`ZPenfH%|e^7n5lb{yj!lkxQI(o8LlYvnY4L<+n(mwl#^f(Re zgvC`x^_6O#Bhs#ec*CwsQ@wIdyRd|Sc$?=S?_SFBu?Jg*JInXB!Y|0)mC?0^lrY!A zKHk~B&RL>2%@dVlP3-L0t13H7koJQbwnkK5MQDVZ{&VEuZD&&L4?Oup1a7BY{;TSs z&M8lNE)6LY-h2dFp76S^LPnt|b*C7$>a<6*>44%w^8jd1?XjXndujHbqmP|@P*|wx zD5Dr3^Y)wSLO}u(9f<_$);&vh{Iy8xm$1pDi!togQCag0P%{Db+Zkr)dI)T7??pbu z!d(rQIacoaRH+QFtR{t8G1gfu@xZq5?q1p6?JhO+s7ZQ=s1C@CrH?@L(*9W+h1 z^C_RKf@AY>_V*!B9aTkAELpjSpZ222!WqhDwo8JXJOfMusDkc?5w=g-gQnPc1!uyP zk|*9hB+?jj;XH*XtE|!tL>iMhj+r~e>>!2dx+sDgMlCQ28^8l;vSmDUQPEaY0nJP| zC^Z)dMa09A;Yx~$!Di(2eVDlG*0$sIM~FlPIBiiFJI37YnSba>1oe$)`_LZSy%nE= z-W){H*1q(9hE%)2MQqG@<|y;h>!Cm?>I`|?{cuKK9)H9<5uH#K+4~2>*|e0bH|5F@ zW9k*fZu?eBcyR&OvD7v-3P43&Meqx&#|YtCX;42rgnNe&6%7i7FmVvL(0aBXdTBvhSDpdHt2rq{ zKtvqLzi(~^&K^B%S&b`d)(hTR<+?P}igx%~{(L+*Lptl+%kut=pjKtwwK@Vh?Rj4Fm#-bg(=OZ#+@ z(b?4J5d?xH!&~9>i4DD{$r{Rges}Jav4RoyCmbQK80p0u@k4qdAZ>My;{CHAGFj)d;Ljz(;zJX!YyZe&{MN`;kh+0a z+Y+6jB$$8O4_bu$`MiJo6pM?aeXmz9Cnty7`}@o+%0)8-^}GM+ox{l@GYZDSnv3uq z`z;9JK@Br*JVik%Y%eR!t{;mQ&sv_yw;zFgbtp)fQ%~lK*b* z7CFW=g4MNQ@)j6QT$FKEOH6sTfMZZ z7V}`{Hx`UF)_%c|A#vz7ET2n@WR-YJ%_a^pXnCt;XnrLPogpvSDhZAIo*QT;dHei{ z9)(5ZMY@J~Bklv9%o*DfaAL&jO)#E!a;YXTzDYmR(I#r(6V#|SO88o2eF{TrnN6u} zOUP70RYb(eq~`sM@VuagHaC|*GCEL!GZ{%*9HKCvQ%#pSN%{J9Fvx=b($ne^<@M^? z=1SvnC67bUn_VnCMWU9T78@wN)I3jlM9pf`8>l7`!k0vmRz5 zC$KwpeZrK2vEv^1wbgHGR6mwNoUdW2&OLg3?{WF4uTnBr$YXrOT*JyCGCa&c^U6^d zdacZ1Y!rx?x>TJ=wc^EzXB~5(tFS8lzsBxUq6SeGH2hK_Gb{>1@E6{ks{VbyzHj4i zL}Px*Xw&qoMGWV>+C#pv)qxWpf&+bYpkLJCGA?K*7i=QXzpY+Q?-LSY&?~V+AV2Zi zjh>IAN2m<r2f_*?&qQSH?iuV ziwg|EF};g`P&e(bB_{rkvOatnG|%SmZT~n%=o1Pr2rLDIL97oJbWUYTfxO5X`H|90 z$kSn1>d-~heXyzKk8b4n47|FAR%O&)86o*l&{1ivI&4n~}9($+_F z4tW*%%CVTzzZU7hcoJT73ZHJ7Tx zY9n=cn~H*;^Cnaj1uQLqluKchxLt{g(Kbq#IfqXD{`e>S`o4puoX-itwv{9sel?Qo z+JbCM&I=`=ZSbAoGahPtyNRu(F%p!s`!3+q&-2s~TQ?ViEtxn3R>SZSoZn-rb8Nlq zkGQ(tC=)W&kLhO6MgdR&i`O{BSoHhhB2**kA;x9){(dGj<@$*QEW4#zi2^pRS4;P7Ekc=j;Hk)HZ$SY(K+1?5|o$#+Xw7P`6c!aF)->*IO z)^fH&4l?bycR<$IJW<=!qJJZ<9@jfM1xxlYI=)O@DUVVN0ow-OPrG^D957~pfV5<< zL7BoX?43EBnsnK>3ZzP*%C#G`njnbszm)`2Na*Rj8ulNju#C4ksl0(IC5>)t4wzZD^% zgalbKgGy5orRiAo$e|2nm#AM^!Y!PIX`bkq<8GvWQ&F`&NnD(fHF_mHpO-u?JT5#h zxBu|{<$q_|7J)I=y^}|R#_Fog7iMI^dEEg zW48wldJC5YDTN?QPHj)K5`i}$ryLtI!?MPvUP<;9=3IhXK^au$wu9h^MH;%OgZs>@ zAff&M3XO*HVLYNd&K3o=&}KVkiJEjQVcXNR&HP)x`#o?FAZdPb3kmnB?vsJ>vBhAc zDrE0LPcdpvuHUNZ=yf;%bVhD>@`W1c<9Bx3{}e@_1UT$bfrssM}j z&^)jt2eK5-?L8aPl)xVH&M|zvW?( zaT)PCSr;-ZE3R{6@-KhWDh2`%GL!&GapUq^{3E7+q$sLy33d4co$UBu$={IV@zXISQ&Uma(4i{?t z7seT$kJuHji1aPAyG>Yxv9rb23(E5&P_O8pPzLTyo+YE0brcHt$P*$gkG)a{;1tjZ;B_maVSl#NuI@(+GSR$+gS>eajCgF4wA<|Fm9qvQ3PifXSIeX4}Pt5P)y;hQ44A}-i6-)62E&2=4`3Hj1x8|DnzPjh~F_`rG| z^57}R=|cUg3|hQeT-a9>gvrjcnw95o5Yf6;gj&R9wvUtMvSbwGEEb^E0*K!1Tnb|4 zb<)SeOjF9_3r8yZSxqvYKUe|oCAMXDUU_9CD8ZXK4eCGh;)eGIRNf-S)3h-?^EAw`v$^R;= zZ4h{Ck8#utJSQk%fVVD(iwV7_ktIBF;SM07oudVhVbDI;dl zY*7TvaHG0FNrSgIGN=;7QP_zAkonOphetPFn%HP{c6Bju_JIm$4>oUc=~4L6or1ZV z)6~QPT}`Bo1=q>niATmVN^H!%-CK-h=O?#U(dG9}G*Nstd`3tbL|{fxf_4)BX9uLU z7mDA<8eZF?j`~N2?zbNfu_*B>&nAUOastl*@adL3<%i@(R7$x*LF-m|4VGz7$Jv z)V#JW5nDhX>nR9VQcQ?-6gT;@QZ@N=Br0wB+}cpYAP;EmO-K<>Uwm)>0e`XMbCU}w zv;@~XM*GXBALf)%B5b8;T9z3cN$aO^#dda-)q5nLdc{&s?m4FTLP9?y73Se!=nBgA z6&h=@%_>KiW$tNC-IZp2+`{LUUsYc_#{cv0Pr_ftFrvk$p+qcX20YbK0WrmP0{??Z z@$+oer>$3!hw3M#rdoJNbA3}xIFBTz?**`iBPGrmKBI;v(B#Wbb277Vn>8O2);{x59_;mBvbVf`nUa3Mf)H+W!w8h`JN+4Bb13jwUlLpYBt1bfZp@5Dm-@-sZ7c0C8jy0*kJ2t z25d?+fgxb~-UMeY3P0vp2Zm;JDLb1d%{&nA6{>T?sFmP z$xH5mVW+stO!OBD>vqvt9Az_R;+`w}y`$jalf!l|M*IDd>Ndc&ypP2-j2$25gafo| zcoLpXP?piu;Zu}UkRc{yB$5o16{86z2rCRPXDUaghZ?Yfcpgycsp$h<;VzX>SqLE- z2@J+HD~n6218UsdWG9%0l4`>Uu@tDtH{08AL`h+I@)yzCF4|If(!p3mxsMlhzX=X z&)EGgq0Oc{N8P?X&f;qOaWhKAe-^y5FF6Jc9V=dJZ{Q(eMdU+MR`*9u<1^CTuwztf8B0hsXH*sdeskd&uAytglqVl<-4~ zXd_x4FgWrpbD%VCf2~2ZA-zq0GanDv^IA(3Q3*UL=k8ALjO#g!&Ltlrr~*zZD6sEy z+I}rfd9l0%E*1H}?X2{6G8%RvfA@<*iT{vz7A&(y%G_yx%1k*c^JZ*7bP??bv=;b8LBppYM>bxSa$q=XaL&Z$>GJ5*^t-o`lu9v=_ ztQ+QX2CZ8Ie~j5GeSE?R1M^T{!qVW*YSrqRAZW^h+-2EIOW9y;ZichGg80xX^D;cS z$fd7V&&s)U*4Oai9Vs?L8Wt|Z|Hxf!#g>1W?)%@}OQpw$ow)%Y#=OJcjaXhiF?)}h z_lHO7B$?WKroEOy*(83imbElFB1d04B{({I#ThOn@XFS74$6eE$ALU7%;YJ3*W5+B z8Wkt)@7g9x>c5{jFfk)z<8(QT`mi4&ZCoB{mdP?mDXH}00yF_ofF?=lHOfTGknoaN z3S}I!DS1T1Bkvj_FUL4k-TR!awYTtDVzPUt&DDdEv!2kH_%^*!8u?a3>*>0nkR(_mmyQ85KDaozJTEHRGgwXtR-NIvi$Iq!h16Pl&=MVSKYd0CsInNV59WE&Q*fK%%0lQMq3Z(xuvchl? z8?`f%n&?`Mf+n%;rz>_+yN5(C-C^Xg!f8CjX{~+9Nn&6wZnVDknD!j5n5gQr-pQM% zN6+1(zly}GK_$crw>Hxcu>(vec1iKJs(|T)0U)|K5<7P!ag2*Rt|HrHOCl`m4i=zCi7B5$GJy3j~X>-Y;8M`t?!aJuZCJBO!^kZXQD zQQ~p^Fy>!-Ah6cIbJ}uEXLJ}}w1Tlhf>G-~@b>)2^uy*~j19ks^SJtznV#`6l(X@u z6%Sjcj{e^cUklykTr<>s1pGT*#$9pNVhU7Ly}NDq&GBB9EiMnup%Vn)w*njj?-o`a z@9A87**nGWw2}|7u~8dl6%wRT0l5JF8@rA7S%>?r9iK4PS8R{2nyv+XKlq;eTrEFz z@+~y_j(gk<%$zf=C?sRI*R?vP7P*|w4QhicPT^`NZbyFs{%337eY$S)lqk`U0RRst zL5Dy(Ou#k3w|!-O6G`^iFhlG})Q>1+=vv`bC*Us*DW|Fz2S77EX(>kE=e=bk(zzGX z)alvT_;L1r8-DI2Tj{YR002OGNmx1oZqubKYc1DhCoD6bL@%rV173*dh%fTp%Gqjq zQy>5r$-|@bbO32k0gzjCOCgL403&^zDb)aA6v!7L75!Hrm+%BIT#AhsVrY{bX+w#} zp9>(9LtZdImZX^tnhAWdKu>;2@YdD<0F-zD)wf>`*8qTBpaKA8h3RlCihrjd(C|Mq z02<}nAUH4jOHKhpM#gvdO3-)BjU13S^vi z2Ta6?(EtEMoX@0?FCLep9s85RtemRc~3BIJ$q!ZbcfBF$C* zcX+)2yKaD&+5iAB0D${)9S;ELf&VQYyj0K%c)2mOFN-LW|E&TzocV5d+#mRl@N?^0 zkLrvAFmy!RKDh>dDp}cS)jfBNI{C9?h+grf_T1fn?dERCT_DT1qxi-oPbXe{rChW0 zYOR5$`n0{a_(a^lD8gXzGjgQuL*Cn+m)t>nd|yZN5y`*k3V|$ZC)EqgP50c*7^H_gwu@JWqHZ9`GE~@Pv0}P+dn7k zoBjOt8bxcZl4}VBN$qQAcmB7n6Rt<)4|dB4id&SXy-onp$zhiV>$%8Y73c11beKZzijQW>%cC#s|s~a*PJn{0awSlekD9pb=*~k zxm91kk?+0#UEAN4Gs8)n-RpH_krse^Waa#I6^%Z{n~Zn9JD;+I5DzCF91kZBcgb}8 zgq8CtgTEH!eZ|)w_Ack<-QG#c)DpFqw#GiJo%^G^>x+M>x?{U0K{*?+@;{gHH7VlV zuiTFg1(A5Vwyyb{`^pjeeaFZ2N8^1ki~Squ-5_Rl+IKVI|LWARw#+@lmfXlkNuAna?^^bns89E9?6{?V^~1(H$F26;hKEk1 z1{r|S-5v(!i*R1DV^vQ^VO z3YV9Y<__T6*&bS7g)&+UJst*x+7>~J;-fL$_FbtPu92U;a&Q-+@mS)g1o>ZX zPa2z?8Wv8i-|sc%o&|a|oT^%X_gxE&iLLeT@aIgz&L#S5=a4n8@Nt}y)3f39xGV9y z*h(wuN}PT6l-Rl0QFiSNzMRg1R_<=#8_R|Y{_x`%jqj}_2gnV&q9R*|UKfD?tX+ZD z4OgKYs&yM9>y8`w9#sNNWB}?QAVd<07r;=K0Jl*RQwNHvgD-MtW|3HPC8ZM>_{g>7 z%Km6wPv;`^k#-&O`sW+os^sog%GCUNOm{BsdB%wHnmn*tFpoo9CWSi1tn*WQ0_HR3+&>O&F zLT)4w6PXu403d!jq8U|y4Kb!lhJuPsNxjx}!Ht-@*6a|fLMSFCl$1wZmiKqMnU9Xx zk&o7;x{RXwutSmRHtcV4c$|jKBqabav<}EVzdx?S5}P$bi&yUC#D6w^5IcdkflvmL zlb@xj<%{E=Ldx+v%OfTFutS#i`zf)33<$UtUY-;$`xHhdPy80cATbdXn#=oYl_4-c zoLNUv5zZ8x4t#Oxz77Y1%uFzYa`WNL6!1tU)`TLUCIaO?*HwlO_k_L;Pc zhAnBp4IWj_SWj(j9dQ#YbD>crDvm;+MhvhDLo+w^e4~k>a#Z?Ox}uOQJ_i(>l=uw< zon`|W0-_@{utVi1R#n z3iHRF^E!o?Zl}hZQlB>#>Hc&rt@n4@g?^;$RkMmO$=vG%g~pF6^m7ZkF-R=n2$np= z+I(mQ^X;ArcFgk#$(uLw^KqwJ;^26~?S{8p#^siDVM2UAXIT z#F~>FlP$8hMFPUR7^dDeZfv_!^5=O%F&ianX#%vt;QOtsbbl}0i%OhCY0fVlQf52Fap2_=;`R7h1W@q9aaZqB zRohu57QG(pHp%a({bQC*GRDaiZ6l92?@KRZmw{`&(S=IFBBYC3t8%J2nJXO6p}CwW zRxSDiS>E)5t^xEvC}JmqWDP>toOxbZ5Hl3Mv9qkWv6)X{%?|)QKwFH5kQ?t<#3*=_ zKH*)YV%c+Hs9#zh| zBu0o$7|P%L6#=^r)0+eof4cp2e8}Z){cRE=?zp4X7v{mOACG9 z*IU7<#rgE9g_HUuvrrvAh2GH`)Tz-l3pR$jY=UNvHnuLLz<5|nD$H4@EYiM^>8*4# zPPkB5LtxYP@^ZkuWNNw#eRHsE+yzFJjtcLFJ+|LPC^ED=Fc>(5EX;Id^II=t{I>tV0CX<9xON0GnK?#Md zX|yKGPKwODJ@EX%;D*t9DMe{gE&^E`m=+!*ariRzCn;WGA#YQ#zYLrdSk-%nGQ5MMzQ=9c~wkHEz999FzvQ z&BmAiCic%)?zyr(h~gC9#q&8lrs862$q%a{&A6>%6_(rVGKc2Dl_+g_FRfiMoJ%s0 zB+Y2v5Ydf1U*6SB(iqpHw>eyfEVQRj{}o&}zI+xSw_Qm}@WPVv36IcHrwtIwCd&6~ z#R>TQqC>e$65(1^2J#EyV`2<6|cR)e4-BL#;88+bfml z{p~iPjF}kzLNSEnx9Ev$R{Y>flU6lb2&s;$lN2Elh_6aJJ%Kdzk3wBqzBDG(+l#N< zJi(N?vPUkz37%rq6Z+dR8*A|JI9{(txw9*^%DK8afeeuM!5EF%j7e~HGB$d$iw&9R z_57`Q#=M+1levp*uQWVXpF&946jd6F#=@T1u^~y5J*q{oa{qnT_KY=}8BnITtQZ*# z;xjXV8aQiX#=2q`L`9aN3Co@B_CD>swOLo)$`7ZddOgO#;dC`u+rZzC$lYU1myv1a zqc#-~FlkbS>AmayVi25Q@E(LDMFX;D@oqTCw5glkA!mwr9{eEb^d5>RC_q)|wHULc zZXnRKDyl|GWU{K_t73EtHIV+SY6{av^Q8Z)uGk;Z@L;smHZot%F#bFIF8mvNUSP(M ztvvar$sh(UG1*TuW_K(6tN$c}GXkBhBsXrUH|A|@}C!UF+#t$N#3Lzh&?5zS+s}Q-E zz%cna`8R$Y;d)bZLyTwS;#f5}HTq#9jV{x4m!E%F|A}A8@jUcZp3W_&*(GpR|3t9I zi~m%7t*XY#;d-U(!3%y%_fz3BR^{ccihp~yA-aiIzHsi(AGljZxXE4)CY(kBc8U)@ zmrusqi%y7thAM3pNz&a4(0!vBS>LPs=e-4a>f5P%&$)4MbIXzeA@RRhvTd6ThT`kt zI+eGe=-t1x#r97QPbRQO|L7$v>tPbjU$47mo>D3-AQb_oD1=%h+FgV^us2AA+C-z=Ds+2n`zR#Ofs1$wcvmmHfF^H*B$9mRwIrV#WPs&D-+T96S! zNM(ZkH7HZX1TnoS{g>Aipz-q{$q_w*yT>A(pN5YXH?7oet0TcuNJhm&?hOs3AIBc1 z2qPZ{GRIoX*IioMKx*Kt+rNu#!V_y)d&0|$;N>wrnKtmMahF(%5uG9)gMK~wzTndM z!ZKzAJhBX4T*{^!@=*Hzjh&;WYo*{)V_VH;ew#Ve{;g8@xqAtvkhZoe4DF+WzEm_wdj&l)od%7CF|(nc z$^SR?@i!In?r@G|LSuJaFpH$yG^WtE?wZ;I= zkQtZL>uOwHE$~1H6xKW-2ilD!nv+$=(w2o06KJ7o5m5GkPj}ddrLSx`SBH;Z+Fqlx-b+wEswA8!%H&3n^LP|)?N2K3~(|``02`UbY zK6u#2c;=Zczq>za{Z5=;4ur$61mAST;$a2}M=LvJQBz zA*hV-w>yf&Vj0$>dyn#}(8@Js-C{(Kk%~Es(mX0=>R7HJhyWbA^5X6@OUV-6uoi$o z=TOx=;N|3jaG*^oycD}QIS2h28iBR5fRZri@*7IcO&&{ML9eHz984;a@|6!MSPm0e zHWI-fExbZr7r*n?Fj@vHGKgLwQZX>p3b!`;-EvHwR8|E{ZLTKTp#fgN%tJ^>7;Q#h zz@aupMGiNEM4Op3e0*17&Ico;;E-D(L5~2{;OLv#ga(tt8EkD|B7gq>sM6AT!8@84 zx6RAv`+vThQn=E8wmPtvDo6?cHzNYRfUP_qX!l}NUjEYb{sW>E9xAI1m4)f(z(PoL zWOd|lbO=dxbQS)$6%H>i{a@zA3;{2Pzm)rL`oBr}%a)gX*~|V@M?Xk{;*}_vfKcI4 zs>B7sCR_@}?A85@mSWZ>EC#&91TF>{x%f$&K}rMGb%c zuA-`tsx;nd7rnl;(7aa)k+Mw79O<_KYGcNR)}qEAE&^^1Pi}s02RRnut&!3_SjkU3 zFM9veIR5z=UYcvma(sE~_|bZ(=Zsjv!@M;V|8%a6=n*@{q^Z$oH$tg>Kz_-5nwN?Q?wbIb`wDwPH49Cj~sR!+edA= zU~LF;x>G=)Fa4Sr8Xt50xpCPcsGh`@GsGv~A{q%|*qu9WF_<&tQ8~Pp^XDrN2{ecq zmqi;j+Y;RhPC_;pblK~t7k2L6zuEm}eKbdAmfkSK97|m#w@T_x11r^87+|H*k@m$|tL% zZTy{*?bUDpf5*4x+xKKQPnkLJTxX?dY*w{k@?gJEkqTw#&}p6?^3q*Jb!26{Em#^AW`B} zqT4^OG=bW3EHgqTsk;Ii%26&$6-~zVn_SN62*QAZM)78jLhQI}+O!a?Nz4{z6aMg? zbxXQQI>UPytu4{7ujO!sr^?4F5Nc_ouf>a zjOr`O?B&G*&!^4In5Nn{D$jDFCe>*el#}jQ5{UV*2nmk0Bg4LFY~g8rmciq19A3Kq zkd4PGKA&D-WP}}DV4oJa*>96bJ#A?`B37wBzk_>bH-6^finq+OZ;eOuT8El`i2o4} ze(M?~AfoIH{b9?@whc$noXKR(ci-6VoMk1ZM||VSdTi`$Zq^j%QTzDbxaDt)ONpDo z#0)PqHjGnwX-;i2K#t5#%il4YUbX2t>gkQSxwwizW|jguVK#|j$@4dbZct6 zRkJ}Fl@*x5VzY?!{q9OmRl05S9Ot~U`W zYCstu$0}C}%>~=aC5V0cdB*!R zj(Z<>fRaWkiP3oe(-7^mBaWE$JkIBjoyjp7G!exgsIg+qxj3Tl{-nfc6B2GPslF3J zb5yS^ZdCtRsWVh#nq;};w@1z504jU=`{dK8!!)-iLIU-XDvbPXe})?U6sN-qz=)BD z`wC0uSkoA19}Ary#>Y#QgqjGYPe(UES7!~Y{QOGtm_IHCQ_eF zEW*NMy*)5c2|d$}x5ONQSG%RB+y4B-7x9Jr{H*}V;4zmt$emike_WiBZ6|nN>sv+l zG5sfsVyZyX@=?cfIrz@pVt|~G`pu_rT*ePSpTEcS(=AKaZ_{K8m~h#P4yAQ4@D4p8 z6OM8>nG(7&xejHTbS+g-;xoy39pnmfYyJRJb%7^hT6OJ?QOloEt|7neo=4rR4!i#D zq|Qo9lVQawn-v8!Y^sQ;8!y!j%I4A<7mC3&W~543hTo`7KJG#pR>ybf?urj#@0;Br zoX*M4nl*1b7`nJWphs`K88h$dYCjj8PYTi1tF-(<=r({_iL8*}@~gyxJ?({FL(69j z59pDUl~gu19?uv=u}y2xqr?(BU5*WWwWGym_RY&9RjxdE8=8(WR=*SsDVzOgHy& z5Vy*3m<$)Y#X@9+R8{e!&CPIYeC{qReA0lV4-NOcp7)!js-LdyG~KQ?Zu4m~r7M;q z*S+6q_d!`wa+c*cOnBN`!-3Rxl_dw~h|ti3k{^(WmvHEauf3(+kw2InIqI(73g=4< zzGzkPsYMi^5}XTrfMBj>DmyCBldx@|v(PJAjTinfd9o6{`6PwxY}#qz4~2P>v81uP zQ`|y}Un8qLGCe|Fe~SwKN-|V^E!CAa`l~QFH^QHD86&Ho5DTP)gB1(ZT_%up^_MQo z2tpHlk2jP+<6`I;c#;rFa8(w(r}~zeTH=Q8Vbj*&KuV1OKB6|SA!FqE*7}7WkhGuG zecRvrYq8|9oAaH01a@Nm=4CowK7#z~HHR*h2ly=7!Wd1vzgCEAoAH^}LsebH*5zM<~oF0qdbk4fcNknLuX0Ra7-) zk_^N}RIztVh%1f?B7~U~a-xEW4pUq7ZU-5@VWkd((BQ6wY<|G-+`-axVW{e(CG6 ziwH?0B0?md5xw?mEw2A`!)LE7j2{mX`}gR&t3qb0m$%&hkJJ0GFQS~jDl*EP zNJ#rVy0k>tZo%?A{54T#ND@R5;rp)7{<*U!R69wyKHf%9ME(0?w#j0 zPWL7F&?A_+w<2bkg6~kSDWbzIll?JFnr~ALRbetH0CdV~qUwGX0n5%;T8(a6fjc-H{}VA`&Si zo`{r4$dQjMsRKuknB*k35w|sqKx!SDR~!e8gie)Zx=lHXhzlV*NFSv#IPqmTLDXIy ze+@XpGg^S4bB>u|a~B(7>IC5-67^~BQzv&)=m@x|o4oRhh?)vwD4}8+l2DQ+2#S_a zpol1@s8yZqPyk$4GvW0^S+P-ifznk{l%|K)ZGb7cv~nFKH@46*a-ixB%V_qUJx9V_ zCy2xzXQzP?d%_MLKEAIBa+cM-Y;CkNohMmqREBO3*^Yis#qd$M>Csx11BbrMsx6~%8Ju--CT}Y2E zR0CZ|Q~oKxnc8G5ED5jhwYlR43LPbqKC;3Dbvd7d(iv1ep2sa?@tL5p!%38oGLB+_ z5LU{rBa>1w0y*1oklkMH?wa8z_K;HHI67$qiKllOnH{bxlYqoqJ{ zCeI9+Uz7-|-H2c(?NUJ4Qlxn0_~~@O`0&S*GpWOq|GaeKVrQ5qJYJbCO318R1q{bB)VpAB*MEEkK zu$ivpm1Zg*^vRBGf}})v#tKh-nDO{oIp8Mr+NO?0JAtVbQKRI#O5{Qr(J{b68+byZ zmP`~>GmLbfE7r|seHn|1z?(t4uc>6BJIt6X8&AXX`uY7+ZjHq`f)IirC_sJ0K^N*@ zvQdIBtfjJdHo0A2o9};K81vc`EsQNGdEpw2N_YMra}FA28gpc*fm~J_B+emT&0%7s zl*t;wIcpr>5Q(*O^UA#DxH*}p^f-+1kyK`K>#Q^+zYC zDkOM?B07k|c!;=`KR-@-npNZZ#;^I@_uCYy5o^<}V+xw>K6vr?GlVHp;u3@qK_mf{ zm59vza#~PoAYsEk++v-H2(|BFdzK=f;hMnb#Z&@6aRJv=zXv(qXj>P(jup;fiCH9d zd*nU{dAW%?x_Wa0#1arJkc?mr$uNgA^c6PZk6}ZTFj*e7o~wD z3#x(xl|%xn0f()hXlr{cmiK)b%`n^)ZE2ce0;HbJGRaLlfNP$GayXZQbY8Q z)k<7k-bnt0D&0ZRa`scwTdeNj1grXHBl|^#YO3sO98ye?i+};mcAGQ$T;jo7s^lR0YLSAF{Wq0z?SOln31cngT zEW-QC8%I+FS6onB%AM@_3+)Z(9ZAy#G@hAcMRCZQdlQ~N;5UZwKz1$?EHem05h^5rLfLV3cs5wa%b8KsLs7LgQLm1z*E^th;q%~Q=sir;*@oCdEJO_? zK@c%DKzNW2O(9PB*AO*H7!X9k(t zF|}&br@Nc3bk6;NoofLvB&uR^q6y6KE=k9;OH)n0AWR@I^JD z#zA6Y#tC?Sy$+2hh~AOl;7~NJ81Y|xPr!w3Y2ASL`l*i`Vp!HE;qho$ZejSE;nWT+ z6i3B}bllxMthX{aNGuI8$j1jb-6~_-w9WB2IGEy(1Hnm-A`ZB=v2;KyhbTu9NHLq4 zk=QE{kk_uMryOuZ0v-$Bt?qTbIeNKWiBTDvrZ}zRoL1vT*rtlciH67qEit!Uonlae zd*8ctvc+C}!Mb+s&7ge?eR`rkBC!xWKdL@9)YGbu9%@)mOeIu?%Y{-UY@~xIjxq(13VRaK?a8T2RBd z5aW8g{TajXW~6=%RPU^i_0CXq$caaSP%~X$v zV+o;QB|UO!@`BK1>I7mP+~KL0P%2(w{rfbVRNkTCKjqvs{&qf6YJF^{J+)m)WW|rI zerkuC{39mguSGkd`vyVC!YfwYeziXYn+!ln&j4P4fgFmt1f zgH*4NvUho13IQ_6H1ZJXa-Mf`tW56ZSNkgWhm7WOvk!9>moUFEo6nkk+hsz;I$fOZ z|59r&{#w0Jw|GURdWaXeoeYjdK<-A*WM!T|!NTjWTH3EyzOdiz4UJn-MZ988tjFi$ zK66e%57*|Q6(83XQsN4zzx&iklh7cEGzgXNlql*s6+*s-ETPnLP!G)t9T)R=-v?}R z6H1>%X&OQEI;4FwmSmxdhmd5i>%!| zeVy#}KmDi2V2-hF^(*4!2XO+zEEOo5x(usdW0VFTQI4{bHX7I~FN+B_WaVyd_@sP6jRjv5GGzE3`I#Rl_Y@_RrZIW_j3wF{5oAL!%$t z&BfhAgzg?(2qK2Hp(LCDf?EJCMEsy1L;?;12X2mC7VeilL0e%{?#3IYNlLI71ad#+p4 zOHvUD2_8s|L@?^o0P=LCBAe{i_#YHr{60Tt7+M@$*kP&Z2!~+=rZEveC{#FKpu%9s zGr@)rxln;1C{rd6t9E!Ex#sV_iUHx#oXmF99dSb){x05;(G$_%uRPT7fuqlO=27HD zK9U_{dAf?KD5|QZRaI40RaI40RaH?{P*-TF+E6%VVGtwvOs@X_Tj76W^&;6$H@`RTHGh)KI|$R8b}|ih^XL zk(d~!{Cx-abaVvW{!Sc7BeKyEGf5f)1i>^_C#Et~5hq>X;odnmGsz{8#ssz~w>2*m z%ptC1F@nSqB#+_sNEjfRAcOnVkUl*e31&!-`Tn5Ye$F@`8IU_ir#lhX{e2bbJI!g| zsAfZe6{6))d(B5@R?lNN7*LeMCV3a$C+6^KxqOvP;WBYn)sZS(Pec zf;b2`;;5)7R3O;WMa-|9b#?Y#iO!pGjf~yPrihp%i47)z#Ynjc9V3)U8?CORoXAr= z!C==g;G~%05fk(EztP7QY0A6@Sc`=d;rH(Bcz!+{q~_q^?DSEv)kqVLgJ}#*YS_uW z3~uZgTpEMoO?Z!4Du-Q1Bs%Gj%A3zua6UqNFiJSMs)tHqJSqA9{nHoo{FM+O4O*~Q z^Qtpt8RvKNsgCGs>QIl7Dv%i51?_%9ci&yxveL-Y9cnX1I_>MIAU@halSm!q#XEP* zMO&MdO^vD?P;#}Rq9O}|BDq+gl18~WNQjGUL47;yJ30XhhHO-)r= z-U3{yTp%)GaVRDVil{%B_@8OL^z(;4|9#`i&u`2BZ20<-h6g{mE6L^_Zb@cF<|nZ9 z9dOA)b)Ys^oG{fBZ0I5yBb?s>-yZrRkDN^v5oL))Ty+8{p&>MJq0I(|_IVY(}t9eLrytJn*doxOcgOGxU&J2ATJ@r6d6m~HAm%H_%Yb$KLIhkX{tGbSuj#< zXcUU7J4lNX9mx?y6;VYW0W+FGz#XRHF}aXfGDx#})?GgSr$g{OnddKV(gLmn7@e3d zBKIUw0#KA7p(TM$+$ZO!!2Y{dlN1V~u*}1PQxY7I!gg^Dy8Rlx2de!0{tpqCL9>m7 zSOg=iqNI=_!QwaB{|_%{O`E(2F3arGt`VCE1lLqR%8EeC$>Zgn+Ou=nuRY?rt^q+) zYX%~&ML`NeV@vozMrwgcQiW8Joy#CLS8QxZC?qLK#VXMybYKcE+Y3&iYDP}lB@Jh9 z!hH5`VYBfUxujK4cPcQ)!<-9*mCYpS zAd~~hStb88?8DQuSJd~v+0k&X*^qMdfWVQYY-f!1$r9s{DI|d;3K0)XP;tdgp6}7=`M2Vy9!a`e z&lIK%4N4xX31U38D3^NN0zgCY{s-w_qG|*3jScm~`&ZpnByx>{dpUzKIO1}wPc&rq zSFY!y#ACev0XRS{Ab!_4PzHM9aEVt&c92yuL7iM6<+8XHAjM;l!4QgRghe|rVu}G6rLGtc?m^pfAD3Yd?2fShHl`@R@j(41pm2ph zk{D>5AxyFW%`6b(T5#g*GlP`aW@*g!%)qq((FDYV%`?Wmho3!J1Dl9KV{)P-7KC{2 zVK*fVOi(Tl1FaGe6cz~vw2M(zMkJIC85CBCX~PE2SFAfLCf(j{Uw;%F9qC*Hu(zW*LTZf6S)z9|cT9 zc(#H6;m;BG0DZCzqoR}8AyNLrh(vT^^LU6er(zQ_ls%)x>ZLHY!?EDc+fgqVyVl13?!i-cy*_+$Xu7Iw}qmt(Q) zu!hN>eGEtL#6u}o*og_P8m1^>nkJQKrP7yMvRv>q$u$$jH#w-S`RL9`{N$)@TWxqt zNZ^1K7=a`la->Tk_7_zCt=!S3i4iQclO&eqTbTqAm?X&CM#L#$l(j}8gH5rB#hN2T zTR~wgVdYOX8070!$kiKU*e4DlrIMawk#Nw=M!~5}g{N#gZb)(hjt#MvB7#*;%s5qq2!vD= zE{HKPV7D^Su_Pm7gNUd1(;z(SZlp8~7ZTE!3ZLe)Dxje@;;ldyCXJ3|e1VZ>pC?dq-0MUptcZZg^RyLyK(kB2U(V{3Qm>{I&RcSS_ z8re&ZP6fhVL8+1oi}(JIyZt~t-@`-yf`7aaO?|`Cqof}D1HpI29#vu$7bPOjk^CVp zd$8{#^L`(9xQE@CY|ev!c!i7bC+*_LY7hxL0Y?A;D2oq|+4_tFM z@k40o@CR*omp$`;{>e3ZzfV~hhql`y6HjG{AEh%2L~vYJ^Zue&Bu6G1$vo;%gYWIC zj*y}fUFfxg$6K3pcW*3#hYJ==4sCj*$Q%es2{7?HwPgQ;_R3+1RVYk*@sw?Vc(^R4 zJLE<|Re-OD`*W}hbo*kdB7zwDzRg+sJeqR#zHim(8G%7R_T={m0r-bGkT5%Z4DYg2 z4)`~2{>qz`fb_el_HhR5h};r`(YQloWJi)LAhX>tg$c$}{94h6^@E{OiJTN*A;k-Y z$L7DfIN1GZW^AYYJayZ#pF9Q&Lb(3$z0T=G5WBuhIfbd+fD(^M=nmr{=5bvBflg)U z4rrkhhqEAZ1`*jr$cLSOwxpC-XHO05;Ru41DwcqVN*X@?C|Lq!N)``5j$$cf0XRR0 zC+p+-x&gyOfD(?FH%H*UVM@6*Gh7sZiNI|Gg|hw8QDBf1Dq0m0Bnp3$x z=-p@bMSG*RCfKND22F6=u%o6rp^mE=1!3$xq10#xubn5P5`S0zATy$~(I zqsh?$OcD#vg9%^92fU(-ki;LW7~vBW6a-Tf6pt)R$v(ZGr)S0407QlcXsAjA#bIx` zruz9s=sCR<^RN&e4h$Zi)E?pz!bR68T@gxvb$Ta11Afl-M9>CU^-<_F@%1+^qa?M= zP9fG_#-GdoqZjEX8OTx{d5g*gf`!vG_1?k$6A0)y>j2D(z^eZLp1An4JIE3O6ab`y zmEC`WePJq1z?cQ0`>*+74#>wcdPKzl76YLX0 zIH!2cl)pG)ths+HxhpHZ{!{GKc__H} zt)j?s?x50XM6CweA=`U5iQ>k>**ZxrM~u@-e|IKb{sgQB2YHv@Ew*W=UONq8aMXbozWjT6BEHfhbovwwKI?$2 z3A}WGQ6NwUfMyq_4ZZ>nc~BJ}x1`Lq;0AR^Q}yq$yDD(ThnM-B-zHf6^YEO|OpmL} z&z$~(aI(CCS-xr*fQg+706l)f6d)X8vLWM%+2F|fc5-Sjc|OxLz$bq(LnouBj|~`o zy>|MIAx;1gAF${3Zz~KC;@hyRV)pB{P8s-HZ*P1}FFr3fpDjF$ghAwpRFE;eJkWFH z^)4j&Wd}ds@A`BBieh+dR}<0}9{8_6!C2ohGrtKi7pBf|GQ-IbB7l58@>6BZ-aWlF z1^xdm0KLh1OG+O9YXHEa4|P9?k>+2$5a0c660(1*|6e1Uw)XNl#f(C&c5`(&2eWn3 z--?V7($IW_JU*(!1!F@Y2`$~6x)x&?#_VYb(+`vRdU<|ceNSNrM0gkOx#h*rFq7k- zu9Y2TNvVuKe~s(0j&F@yNLFhp3Pa($d~bs;sEB_KU)_2A8@xerMbj?2CDX0VX-gq> zAl-AD*|^O5Jbq7~_dh1hru9TN=Int|+hx_IRsLeWU+_Cw^g{|tgJaG=yZAmo++rVn z+X#H(-_weNxJW~^&sI=#G|R`a->2rhQOM(mkNuwK(x&Z_nNihp8~?Z7)?W$=n0icj+vIYQ^R=qijSPK*+O7^C z$=0`rx6Q+d>dsz2Kd14PUbETVRXc^<*+hq@75RT&0A=YJdR0iTf1hQ)$M~Pxr$ml8 z6ZGhCuTR>ld%g8Jna*>|bM|8mM7|=)Gyu45T+IR8UE9l~a2u@=4K>_)y{=(Vs~=do z=g4Y2)={lIL#1vptnazr;VHnHjIh0~)wgYv5jvti87pd4+)>Gf*Y$CS9>v!+{XYN0 zU(kC#F6HS2GvD%;`9dM@|2Fyksw#}@WogP4RJ3bH08YNVy*)005A0aHAL1b&w~C07 zr=kO~mD?M(0#b`Y=Li1_DHn3Dt`$7?YM7ZLC1M_*bU(i&VfffD@U8BTovD>xb4|SZ zLz`LrV^_Wxqi zF1lB}@|RuJGp)c?OfSGy`A}^ykH>fL{$vdSAp{gAp4N4*d)@oyzhs_ra6{0a9ODF- zC+Az5(J&;R&u`(n(NVxKMG6QYBGuv3cS&}yCRw*< zVClji-=0qCjbYOrD50V3(a2@XA4=gZ4YuWb*4Lhe3|?w!~EX>DIkd+Y1M z0Pga3(`nLwsr#^FQj%7SY!b?JMOOwu!GLvQEx!^eKc}pvPJ*1Qw5@o&)A) z=x%e<-fG3u2j`-x{Px-BJy|1jTK{`P%<|!zTqVd@qa#FAE#V0 zm!MnL9Np^7tL-SXf6K-#r&F$8LSk>soT*pQo=6kB1#vZ}Zu|?xYaXAs=g)^u>>c91Di;2~H=DaoPCjh*bc3^hM@~kcS5$dWWeO-Whl$g! zanWT(Ym}v$kc?ei-$*{&rEKoGQqZ@A_T?R*l;B4NV8FQw5Kt;;QA2~``!nyW=syfK z8024Dlr0RX{uF2X@UU0Q!S?l|u+PCz{<@ffr_wviAD?ry8`S|nad0o0f||In$k>At zkoV)aftmavsyhMz8~(7D z4zIJj&&MeFjarW>hz&XOhRJy_4G&0j$)h|Ig;D4%nuShBk-a*PQit=8ut#D(dzcS) zOsF5QC;q)d3lpBqTrz24eeS#iT!ysE3cJ-H8%X5jCha6X9E#XyqigR%9=H-4AZ>x} zl@r|?MAOdq@ZHFG_1(=Hr_7r1*3qJv@u;-LQ<<2|wpF88b}*RDW*C)(Qev&fxlRz7 zV0W2N2`hVsx*hQah;2DKR}_())@9}FghGI+Pis1P79S#p!kK|qUZz}0(3ENAVM~uOVRDje zC#rnQwdvv9i>AC?Z;hHxq!+Wh#`QN25UKb0^Y#59+a~!>90?bnE8owBT2O`-s2E1H zK=5{}JSFtX$6gw`^0sa$Wua0&6Py!G_UNC)JA*w~SPucidc8Jr=5k7klNC+5gO)5A zmY6-rE!0VN@w{vs1_J>Bv`l)r*ZBR~hcIlZh|-{fgouGx=WV(<568~_m`^rtTzPXt zSlXWPm)92Oh|LZnSKLd!t5ipi$DnBx*fJA5{XT9d$z#A^m2(VmPkQ)EJfv`hCd1(M zW6XNNAM#J?0yq5sD1WjcfCC_c%$W*QQ0aX~0H{u5Y4DUIHv>xlP%=W~!i=kQ(K zfQg1ENgwe?nk;?j588ep157~@&;mdtN?IDAiD)TlprDDRp%Nhol_{#Isz@rTsG5>s zs;Vj~pUqYSteUE-sgS6mN`!&{Ac7!>5`>}#B#El3sHmx`szs`*s;a80lB%dkVydE| zs;Z_aqN*w?lB%YviY6+*j}OpM*ZH^`_K&|D_YyuPiwex*asO3d$wfR+e@CjsNe&96 z+?>Xca+rD~5bFsb-hNjOlVkPqg4R38$oRVq|m!qt_eszigy6W!~{yqWhsP^2yjCGKIJ?c zV*p+Q3)DT3FbF*`dJ-00e$2yM2tlNvC@Ln30HH~m8X6EKs+tNwfg)&-DG83CIY)!P zzxUn^K&Fs@A_v_p$3EkmX%V1ky5Bt3KE(@ zq(+rcd{?JlKwlx+fW8S;X%HzD6NtqZj~(ec5MJd{B|?=zp=lI5JL@r@&5H*rqG|xh zs)?;97NRC1tqLU|_ZuW(^*si@hTM1pimU82>zh* zC--?jtnCExEdVsBN)&-g0DAZO!}(6S_fQ^(1qaLlNQD42sY~QI8BpY+nDub4AXR8X zgn)%aJ6S@4+yKyKPzW1ZU6~;dR$@tj9Ysb&84+0#SH}4Q!(tEvdTxC7-6s%4^C0et ze%4YioY5HqG6mFdfJg$F8UCiTG7QW`0I!DySS!4BhZX?sZ3<>8nYM*NIRii-P@qr> zlnM`Pz@Y&RHI(d`2wRm=!A=W69Yj>1@bviN3M+{KdW8VQ1EmabFsqMP!YZ9Y3reaq zA_rmR-f0g*3(p2rQ8qB3v4Vs^bp${xvXBtbWtOUz*+3>D5+i3u3jhKT6cZ5uJK>Q> zk}28OM-)Wr7ZMAk8l_&iWdMi+kkG9d=*p)?IB^AFvOowN3oHN}Bn2$c5VFul5dlbH zr9ifHSWqJ~VAqU?nfDTyP! zl%_WfV8VvfY(kqw05oWB|KsGn7!XwADp&>&;qfjPqhL<^1vK;gVRxN)IA z80ZvFGKoL{QmPbC0MY3@kw60UKm(xwq!haVp+%yK+%`)rgUw?QQbhbI z;pspRNj(NZ4FDm60eY1|p%c)7J9uCbPKW{^N4W$BfD(aMvJn(H3Q&w4y}m-|K|Dx; zQh-nZQXo==C;{T&z#N8@P~bwk27nqU3PDnmgi?h88b?5NF(lW&efM!pf-+tq7-L-(P?j7_?g{V3!c5a-I!!!f)B6DmCn-Bva z96$}i)%`(|gIcba$NgxQBEpmzKX!tdDz+jJ(au~(Y z4`M7L!AeOcnjH;P7C&oqz-vZPtbIfs-gFpa6sCKv2j3*ZMx z&;&LFpypuuAUK9* zOm$4i0hHHYj@z>+Z2NHF-zk&)rRB?z$^J|@Ft{zU!z+F>lAQZ7Mxi~Fpfp9US{QV{EC;l@v5dHTt>eRRiuqfH-0RJ$6KVgS+fYHfAvOuTA`B10p zIm0MY83aNQAVCCh@CQF>uvCyj5Ky47pel|%!XYP}LQg5(PgdgCeOBzQ(J_a!MQn67 zSx1?-JArCft8>6K6(q|+-pyfC0zii58vqGm1cN~UyOW6hqeLVe74xkDn!}ok7E)9= zi_3s10OJ7R#s)yiM_=r~Tuijlyt2wbgbbhQvdln7WGxQ_zL*Ol2ILQE)&w!59}t`* zq7-|Z;n;6ZsypvOgaaodoQU%1p>Qy9Ezc5gErrTlyzbz@J>q2z7D*Wi4(0p)(-))m zU2=b~hY^Ro33~wMV>Ki~Ck!w^;d#|kA!~2SvH7!5sf+}RT(BCq zj3CLx{zRjS%>X2_FwieC05o;?9{IB_?Jkl6SR$jFX4V@pJRj#Il3BsKOm+~22NPIq z_qW9k7HW0t7n)6H&O=hOZg3LEWaJ2#S;o`SN9bgp3;&n8{t%x#xPy=MIXq*zH;~ zwGsJ7>t6u?6*DbQ7`@SU!zWRSr3+0{QJe%7;m!*j6tp!(CgKb#mc|bf3lW+Rol%Dw zI;Etl!j)!ofm+&;!Vr`Oa9e&3eCJueR-uF{>B%S{3^qV?q(B6Lf%NU_&zU621_*;k zyPwkLK}MnBt(p2c;VR#jN~~OM!Qn&J38kH}&!f~?R}D%Lt(Ce$;$Sf`D5Pwv zYO}OFK)`^c9<#R;Cyx?`L9TBA$ZWVX31J-Dg6-=U9nHOH-z=IVTa{4x+@Qc@Y2r3O zF^TL*)F5ZH{1Z3wD14%_cl*6N4bF}alVxw0wB8(efkrc4MmmCqi1$aN&jY-n$COqd zm{bvR?|>C}8(wuGLVO_0Eu&3>|qn}Bi`IYs-2 z%YX;x$mI`zl<;VNzPkKpKR51p{1nD5L}xo_Csx>KoYA5<5vz}GP&%ygZd?P^Khub_ zh{~H7VKE_iR}oCh1!o3TtaDSkcEX+%VTChYb)ZkG`KN$bROGz$O(7L@XaI#<5#wey zYCwsZ06K-x6-h6&MS#b&D9NK06420{LIKr?h4c)7cpP&D2~7w#4)LhrP_HTrsY@TEkz2erb8&-n=qDDjae$Zt{nFY0b<)14r5%eEw6l7zC&BB z0j;`G(;J4Nm6L@XWkVgtA>>HylIJQ7g24w}yeL2%h$SQ<`(G@XLjdW_aW&-kh~<{+ zatT^!ybc?3(l4wEgg~04D*XSGA)ueO9j>!0n57UgncD{2QHUB+G5{uoCo@?|pcjj- z3>iX&%D8DEK-00BunUF1!+>8wf$1${Q6O z;~?(?5NuUV#svZPvPVpWNS{?8iRTcwh?%)^hI+>^-FbMn=YP`XbZtGi98GkOK7tYU zI!iiXaEu_pg;8~NW3>a?!j=YrA7O>Tk}3QcHF?S(JPiEAXr%+4DTEL5%4L192oO}L z_ehB#xdE#2TPb76i1J}C2w+%7#!(j{(0RvyK zwwu$k5^#7lU`V?`ku-b<`TD_RbnOu~B9#^#3IQNBU343Vbl`YCPKP_aZj<{aAPNdT`^*402N$oxB6NOpT-5JYXl1r-PMJ{LyIW9JZ17$F{w&)>gNtxYtxcF#Jwd_TZ!i0rOHEGxXme@ z3_U>W*3cX$#pHnMUZivYd6QU9i$w`A?GqU=Rr80x*lG%2liZVEi)T#sr!sA8N8+F9 zm~wySK_TWygL3x|CbSxSx;~cmLfzP-DiEKfS0g&z1M2k$5cUrp;Q7``De5{8046hp z?{vYVh3)Vdvg?`6fu#qdHD0~5Xk&uy*>YYB!5AU|1 z(*h>mo?fIpvsBioCESTUF9bW7JC=tgX@I)5B?AdbUz);7e&9(aEmaW|lSITcg?^8~ zaOF*XQ>xl*e!aI{1;|66*q6YOk-Q3|$_1?%3-^+utC8GYr>*Bu|ap1f;^6f z4Q|Ih1H*q{1_#x+`d&zU?~5*HC9L54%@?1xW(hQ-Xb z^R=4c)3dwf>n#91e*W)orRWCD_p)kC{F(Xr4jx_=L?C>J>=;NAD+?T|IRAusdOeup zeM1&O3tthz2Myp_2Rk?)a25fR$|5YO0%Z!IkbE2$P_`PLz>GTwHz2}(Q4i`ax6J3B z;W(umq3MCl2pr19ulCJ{+F&|vo-x@mNDw5qW#5D$razOhc=9sZ2bLLuuvw`~A3Som zAFA)#!Rf(5ZUBG?%jv*8U>pD>kZoW(0OLJjzvT{u)0~CF#D|zZ58cXQ`ZRg%qjMu8 zBN#$5LJw_J-zT(tu{Uy4&%Se=H$Uh5C@^EKKO{pz#ah1q-)>r{?DdL z3(!JH$Vd~&bZQPacZ;6R?ErhW*wu1ELVK-5%wNr16Z$K~t{~{S5~NCJf|HuH3aYBA zs;a80vPkug74~ZD9KfUqR7%gwhw`0a;7-$Ij37xN*hZ6*KFwj&VAzSA+DwU*AeKyI z?z;b{`ldjT({QS4K4cbE2I#HGg2B}6X7`Eq>+9#|16cA|7oy|NB3TM}&p*9znUo=g zBqWka27bQKq|_R<$iU{AYbvbIuLI`&xUA=sAkWRwqk(@X(li<x8cCViR?q z?Ef#Qp#%%I()8NimGr+Qp|%JB^c`7VN3_$< zYah08e8HoIuJHx^Ub9l2yvK~-7+XSOb8SQF?$6JlJ2MyV2#K@BCycZUT7s&JTHa&4 z`M~Da$pLERIPLrogZX=R{ScB8LP$voB$6X1%eO$tD{&g}nAivr6T6vM z0wf6`UMJODM)m)lzs7(6Po97A z@z?#otp}9lQUTBsln6y52?!D-Ohp?hh>d|UjHkeb;le&61b6WxIdi=A7Xtz$2q*P{QmEHKSNSfPf`*0f3iE;@&tM<^ak& z0GI*T!sq}fN>dQ%!T}MenB#G=c*rsyGv_HDA{;COLDoD#Q{0EECW5hO$QveySE+8i zAc1oMyvISsJSvAjl~3N=i=vAQv|$NyzcL!Ctfv7Dk7N^kR2n9Tf0q>jj1=H8T0P=K zrm7htDki~61T-@suxzSj5k&KP${`CxP}D(2_`Fjhh+P&Ibw~LR#c^12FK9T2ERbsy zAy?>)r8JbB>uDJIhtdbtCm_*DLsE-`0FuLQ1gd;Zyk{@QXzMu8yYKx}2GHy}$OW+% z;rO_&^8_Ypork^g=nv*%6m)yOnlIf_YCZ3eKN8{=ue88zxepNhy*hRMnf^k_T^c=d z44A(M^dE!9QrJyuOOg72AmeqIf4&q*k_jO&<#4~&rz#eK&-nQ9 zPM5_;7f-UeRNZKjdkUedr|OLzJ-=tS)1#}$__h7Jar=0Zpu_0&5=nU19;oAx3$4xm zW6{rbf@6N4AAh^Eq^Q6zH+W%J+5=T2l94XVyXF3C3?J8lJmCpsw6NI>3FL)Enq(yS zejJ2*ySxo{3CtJ;NJ12)B2*bg=}_Xj9&Jw3)BB7#o_HD!UY`Whl>{(D!mh{(AQA*p z0G%UX%nb*>?JENy3Z3UrcYkR|UVe(_MLegVx@_;`LMA~RpG`wid_T^K zgCOsC=Wg^%TOrW(ce^YD+^kjZaH3{g{RaVIey>CG2kmBxt^ZldN*Q5tW1VuGyM<1u zx*3!>+AYx6lz_zoi@}(un-u;wqbqf1d4a zF%qcgC2V|cN(o`xAlE8!&_bWoVP4?y6G0?FSOy<(@E_&-I#XM@+deQ5x%ev!iB{xZ zL?w)Zu2y+v1Q-D@F$0VQO;en~tkntBp|wIN^G~0V+5gC7{64<_yQ2_%>B`Yw{}*h> zM|Gjj70*O$VXgjw9NKjV%o7DoEWbcyGs|}1>fnT>(X(W*k|)9xv0X`qk!Q>c^CdW(pLswf#8BFmHeMS+qakMitLGJjd$bz%JP z3y@|}GZ;l2V{94T0~oL-`4}zGfBKo*Em&LZ?UZ^)m2wE*W>nA+q1tWAlkp0MIUi`A4K$L`a2p-{Hiun zTC_L#CdG|b7;L1HPCdgVRaI4ivjcnHXb*1?;Q8z?;NE4+)%f`zbH+=`E2>P)Yyf0H zo4?arwv8ERExBtLD%@Ea?Dlhvil#yTn?OacA@O~)GR-)9VPEU`J16q}iRG&*FMU5- zfN@8w@e5nK^WK92k5|Rwy}i7?dG5`tL0Q|cH+LmZ$5oN?7OqR{JzNWI`MjonKN})< z#bQVSBqkOuwNNlK6f0985HwNvtd#(>Bp(;E&BRwXm-1XF=)WoElkmo;0)T|0bKC>N z0h2IfOv#mlV%jb!NT~iEd@_Lw2CA)gI=;De*@?(E!lKSEquxgX5J81P1duINO%qT% zhf>Xgpw74kNE#W>z6`cV7oTPeW(B1`~>hR;cf^AyQ>^{nQ(vFQp6=7V zmj9Iw0s_JOelk(@dsa4wVD9mQ&wKOR9P1DnK3vey^nt3X5XFMBp$bk_7Z=G7m$>Ln z1m%GPni4_*A$wjB(@ly6LJ)ZUm}newJHs5*&!XO~;+I7%zrzf29|7p4$^I8#UjU?B z9rpV0u#YBsYqE5eU1EdqbU34ef(VpE=){VZ!NFBDN0*gCYfV)r9;o6WS3+Cu7o`&G z5O`Jxm&oqaj@)d#5em)D*rO0>pTPvU0^+5|6EJYJF8v8`Xvah6A&v`9lLz{@9u`3+JpMag(@no zaL764mDR?1|9JO(OXZfHXFBQOhexPbI(@v;4$3-7BXK2bO932!88?tP;3I&E1%}Ht zYq@tgHHzJA8a$pVuCrwOD~G`;(T|S^V*>$Y;*fj=!VPBIwJ70I(zOBEqX#LIB8iJc zRnX66nu5q^F+qfj!)ZYz7sa9>m?!b{{h~;Ogow^5P6GEh{U_3;>>Ih_OySrB0;VJF z%?%3i`L zs~@Q07>}rF42Yj*N#+A+%VQ;?v51X7K0OYk;v@jbV>>!tBl-L&>w?<_pr%!Y&qV!ZEX3n-eNbKn+BVjZVcr`wZbSB0)ib3 zHTSJuO+;z+ndW&C4K*J+C@FL!bL4_y-wT8)5Qc1zgrQV@_3CGfDa$P1ki;#0$`QDX zJG_Xa{I%#NDV6@(C9mO*68q_Ptiwk&^}Wv*pz|ueKhjrv=&P)>peR*)}AN>&vio^Z*FKu1pTgKf3R6h~!L0Dw?cpg25R zW9GiEZ;VEGcc9(hL>6;e!q2Bx0|^J)j=sURt@IMAL9}&`#GncpLV|(*sXpoX=&?aVrAc~+k;ewHBPKA6N?7o9&&poW@b4$T+Mj?| zHpYLDJRpD679OZZ0R6-;aLoJUs;C3t0n*AL1zD?ywRGO*n2C-sm{&kKQUEvU-r(i) zO{Rh~bZGwA+#i_rPDyBi)#c`Wpq$63*h#rS>Z%}U_KcE{$`CcxA~F1}9a3;ky4hVU zn7&wI;f7%Y0YHgR31)ZY#agrF({DZ>50_!nILq4ZN)OH!tlznIkc57c!hAe{?HFkT3ZrYOfN}@? zSCNR78XnxVi=SKCL?im>ErF1Q@TMcccH(QYU;qV?K%?3$RSG)UQ5+Hpmd(-;jDFDQ zX2f&isZpVYf7`e_h_D1$k|MaKRT>5-7W$SzgZqJwuryy--7cGjiSSol!HGZ-tabP~ z9!u91CT_FLn_4dg1A%~DfnTT)P@x1upj0}iWiGZdx70GzJ;(xlNn7%;> zdY}psTsixX+WlXbN~)@=s;a80s;a80s;a80s;a80s;a80s;m89nf7bp{EDios;a8} z?wYE{O;?60s;a817_4GRDpaXbNh(QLj3k=%pi^+Wa_!fu7T=Xve8zpX!|0+BP04V< z$|I#fTJK8XIfr$|r(}Y7#Rj0ll>Nvf>52|OogUxHl{s#}3zsR+Jyp5O21&BsXyIWE z^<}XdB6=-Apm2M|Rn=#f72rNh#2msysucWw7F>v?oXQ6FeLp%2{gKpK8UtJLbrYSz z_2fXyoaGGENk^_j`PE{5)#$8!O;_j|>tCzCkfe<(^d+jH4dK1d8wYKw1`bR3^V7^X z*uAtt$71o*iFETr3^z$FUB!?ELKPSW_IG8?8dfq?q5Ax)G=OncVQ8U%g!TNn7v{U66LT>A5xn+2BzkP7eIGgs2P&Er_04S`PT!ab_;PO^S zjqUpEb8dD_JQtv^r2iKGjV?799YaUp2dJTUr=Mmy>p_BtJ4sWjZx?RwcCY3)h@xe1 zwxZ!~gKNX-0HN+n9u^Aj%Y;CIAV=G&Dbqj%6I}$L`N3T6s;rk5Wk)iHWX2mw9hq7> z27%PweV|AJ2a!PCI5I6q?jF#%C;@{DHobC&*+jqS=Z*QYGAPoyYheznYBiU*@YWRB ztv1UGeLDn4TY#^#_%=7z7%h9)DyXsQKR85i!_X)=`ZIx%+>|LFvJMNUq`$G=e2Td^ z;uatb6&hjLI(32}zi_W3QcE^+2p16N3XDUR6jZc|>I+pq?x@mn;>m*GPSWeF81{O_ zF64Z~^TTb^;USSvY23f(q!}zaE^MOHKVxj^c^Dwjryg zDD&S#$P4`6W8OFw{65s5zjpD&X0vGW@ct)Py-=mWC3sp*=@GlFeuwF z|Brdj!WiaochlK_KHWLkGHe8-{SO_yztJdx=F0-k_qB7>D^7XB5QK$O$7c=GX1|UX zE@~_3?dC&MeKoO&gn&T|p+X9`(fq{!C$3d<<=ULL)In?1Ne2Q@h>3@avs^h0w7N8& zMq(RXdo6Sb5CikpuRyBsQn+@qX>X()YToP6J1O%aATcpi}~qb61yk%UsGS7OnL7=UTbKhs`>2DDNM zD1;CQq3D9R5Kt5#5)0J@aN%WUyCJ@)WuY9xsf_9KjdHJ8ViY)$P?d}uKP8VqcqyP! z0%a^RY5O6a0z&I@1RTP)0rf}vRis2AL4ph_&?*oumFp|u223*Oj`3F-;SMCF1oQPW z)VaxjWW7$XVk9JLUiP?%13P-WWGTE{OuBHpQtmHC^hzJU)JX3kNL5e>y4xXz*yC+{ zS3f)?C$6do*9BRY;GlZqVVB3tXr#InsX$N(^bt|J=WUbyKsWljHzu1!EBINFlp8M@ zZ2i|@8A0syc>wflVn<2_L43-$e%tYf}{drI!$K@)aNx<^yC~z^>py48Y!xz;nADf0nvqZ;Mu@(sD;_n zATS+Ff)|c~2MP`{^6x+>4qYBm>BZU*kq$wa_=Dl+vBQ(|O%s2=T+`$Z*uoHyP)Q*n z5=I3}RD~l#5kD!wL`_i>2_Yl`MT8`fom+jF+fK9Q;&~5lzRXHIJTX)@6@NzJn90wb z%!8p_)5{sX)ASMK$HrK({syclBE+v z5O*iu$p@EO1FLY4SNnqjK>_FZ$t@Jev#p>)-z&Dg?tg!mlRXeTjMpOtBoaPwltw>- zC}uDsSo}&Pk|+27q$tsfJUa)x(^v6kvlB!(pryi4kSHmFKxgiphbFspZvA`zr0*(lkRKe|&0o-OnkA~GwGfS8e5+o8*g)>fOOswlUwM9%sr9C}d^oygJ z!1O&Z5m0!yo^flB{Be$D#KaxQR+gZMioEgmg0#I+(*zn=>P~-YvR~{EAIfs)ND)H7 zE8ZO7!|T&nO$XoXQJ|kzMvsEOj-?KhGxjx+==@d)I^-8ATIyg-9IU9`_f(ihm((Bx zELywjZaA%$(BXpJV9O~;Krjw?SX|C!gjWD4DW3SC1q#q}n{fExyo6iUPt5+4;pT_- zVSF0;aaHC+IbI{I*xKjOIbWpyXDU*(_1`B`koS*zs^9Y0Do%t+`rW){U8JAY_}2`6 zO<%tJz8yue=$QNN$8mn~dY7@i?tH4Bv-W3L=OfZ$`R+)6`y9PkvuV{tt%@~^Q2)F{ zpQH2jP-!(Yj{m(vMI)9Y?%lo-PqwwTO7aSo=xG-@ zMMM<}#9Dg`5`Lo)(bV9BXPSYz2o22qJXu`_yB2f9)CbJCIzi$j zJP7buzUjXojCjrb!m<2@$&Kl3ZkUpU>6e+8$=`qpQ9*?e-U(~gS$}NlFT4H z(b1QL1RgI`7y=avsQSyT|1JTjEvl|BKyKDcqYJBaup;zqp+lKbf(?Gp%6~k2COleB z2BV(XXxi8rY7l+IPi?43UZ1z_W~@9M6E(nDU>4+@y0=fNJW@jJ;CAZ@`PT#UTs+S z+Q9T+gHY!H50~mCU$I82C-=U$Rfj8jnfMB$Q#>eLRB5qu5$Af52t7r!gdFw~>UFRW zjto16`J_7P{dFlk^;?$_Q>s=R4Pd5a!rZ~~*0i-N8NAvZlFMq2Z0j1;RFzZ}C{c37 zpM!_S1wRq)9}xWr>t;SetcjBAgheDl4rN}V7a%#F1|CiQtAuSLgXq5G7NB!rEEZTx zV)l(p9u7VWgvcLSLzs3h(d`Di%#|9KiAzY_iTAiy{Go9M&Wz|QTBWlt3C029pedg8 zK|%o_3xlVCk#O>5E5sjmgFr!&Ng)IzL}W{$q4$d8+kteCY=_QM#E){QdL9C(BBi0q zS^$Dlst70yL7-?Vfyw@k@~-jcot`Ve26T}D6#++?98D14I>cJ1k^MUU*N%_ zgrq5^^MgecG>pg;710w0sG%q-l%j>CB2t2orD#ICNq&yA?r4&+7vPZRuC@BhBN*Wqap$lYK{J`k^cjKjr17ih5w9*w3Fb16wVIaUjl*2I!M3yq-h8!ki4oak@iX@n0 z8nl(Fpfoh4DMpQAOl;K-EEb(rXKemI_TQX6hwumCXyHLa^#@18_ybL8f!)Du!IBBbsA0j_FMn2c)ZVS-nyC z1KCs%lAsh>peT8I&yy!gwy?P$&evSyBZsIjt-?qhQb{2RB$7fBXh!A_u%lmTxZ+RE z_`c0IF~tA)oR2-{<^z{HDM@jXMfH;>0@-*>8xkv~dfY4m)r( z&$C~^pP=Lw{|bbFKvhLdi4&v5Y6vN%N~I1*^>Z{TQV$5Csr%dYS#B{{MPvd&L+&zo z9X}+Fv>tLMPQi-@7W&NFCZx)F)b5G%6a>2dzx|u~>WpM8gGm@4I)0cbKjq{!Q^SgS z=TYgsA0A=)AM*cvr!p!H5u!+qLZDCZ57n#O1;ii8DgpRp@-%@&e%I{b$SI_XDgqKk zk<%Pj1&jT1r-iMVALrO{VCeNU9^=9rcJEir#9~L;AGrFo`Dx}KPgtmn`WnGk)1S@b z-|N2L5$5@7uyhnaKfIC%C^CB=*Yqc^DC;PmPswKuVgpk;Yp59RTRhON{}wdJ(NO_0A&EmWu7Sl=2|yOuw#vaIRT@iR zfYAofL~Be|!HLl785n|ABEc|}5e!i1aceA+4c`_@f`Pn)RDB`gS=J2?>Q1`m65z)>LiDsi^#M{v%aFQZ)gG zHHYPNnCjjYktEO2DFaGTCj|SG^PFFxy<`1lef1XdgT0*e6e$SuVn6OMvU7$j zh5r#IRROWnSTNC^{o?c11)t>)<3RnYcHQHzukG!|XBta3!w-b%jIUy>KfG`WZF1nxwCgmvn@XL7SXZCP8 zZMIePUqPSIm5wQ@J_%@4Mo0Z9rdcW3HxYjU3qy`_!vY2Q8nm!O^Uh%Y)Zi95H}JWC zydnFJwU=pddjCg$PQL%XUPy`?{PRhd`yqIT4iX(iJj64AxVt}4oP1aif%|!1p25pK zCb&o_qK+b{qMZ=leDgLR*Z=2_xYzI{#r#H$iKGmhCc&9MULG8P%9O|?qWo^s*y{{} z-mwA*fBk@Y3EeNN6_E$|F-27fNd2hl0bat50hWqmnEWmd2D0}gIs7HAb3Iln0Pl>B zdO(S?nj}Kn!iu7n)X`{IjHER8Uw`%=5Apsyf#H54%q7Yv_%YY|kiOd}VEE7d|3tFN z*rI;t^L58Z*Ces-Z@ivF4_?f6PD7i)DiC@nZ&l>5Uc783YeLMhHedDV)*Id34GBMr z6i?H}bD-ed`nPr=h8oxP=VK{RCD~i-Wf)u~NQSQL1N63#4wDcH7C4qcEFwmsr0jtZ zj&$Y~4ImRxCQI8uMx^r7hs%1h!!4G*=|&k8YLCMOyQf`&zBC&})I#$@7o6Fhs6XEX zbtHL@kRbg(qxK9EWFXe?{~~2hrRcY z4nxD3#v;Rs_YnjRcw{sRq&RBR(!CtFvoP%bs+|bPrI&v<_rM~kAOz~`DNdO5`u%=5 zB|Lq%J;Y9=CLX_85<>f8qB*&NjlNWXN*Yd<^+cQ{U))M0#R|6-dN@FoG16 zl&58Nf5QKYejZ7g^$;#E_55FuvG0?+n99*3#z5VX-dp}tUD_`#Fp!2@Xj3v6;57e^ zqQPSziBTk=&W_r(f$NAScpI_+nD z27)H(c#ZHcGc+a-qRFmUzTWEv&F~P5C@_Ta(Q6Z2YTw`a%67nW-Hm{;m+|_rs=y1O zdi^hc>v-Z;{oL&E`aPGb=W%96&x5E)MnIB5{-7!Rh|l?}$REz1fc$Z=K^1QX#ruQq zM1(S@WH<9F6cA9tAVTUWWT@xXOa+(>qJ(vkvv^yTONy)3z~zaq7I!)j-fbq3;*t_J z2)1tf!#77`@7O;0?WFOX2k=g{i!L`2xU~@TT8C`^l6^bJQa)pKxiJs7>brV}sDH~c z4G_24OGT1{3pSA3zN&WjRuI&AakF{R@Wd#$Nk@M*60$UQlYn9niIhWuF~=Iv6dVv{ zsvN>6d2+LYjATe~$P~S}8G;6FuHlHUe%U`mziqN)`-L9|W1@iWZ^xq^$bRX&Bn%J) zL_dZ}HxCnRJIEEDghCpo;x}kbHSSah^_ydp9D=K#dTrrJB{u=g z7Z(Q(Jh>_PrQ-0B5ts=F^9zt15OO1y(Y8=ZT@(c{O8(kk?}Oxu{vE=N;Jb6cY+*_# zaxdgypwS2rAroe2Uk9(%kHg*Q*ql^@?u%_z{y#V0f+f+}yVKkFzJIE}=WDN{=CNU} z?vLMukgV*41D%W6!}ou!y@S*rLHAUNY`2d$2@Raz7hxEDb_A4^i^qu)bD10_CEm`G zsUaPh4nB@9O@Hl`fS#`i;RNTu{AWQ1)*N=?e=&383`X~Jda`+CC;^Ut>Hp2&$c%%} zqw$tKTb?9iquu{3Fj(l-zuPM=f|@Gwn8&BNlSnY#ud=Lf_9>p<`g&c_g4_P=^x4YslVG1$M?Q>e$^f?yAZgFYdb+bi)zj1a zZ7qB!zAQ?GkqwvJnljrJ&M?EU+d~@h(sEX-AL{=;h_n6vx|E$eO+nvM&G&{rs`Xjc zKSmo!uHpY-!N`4w)Ce2;H9_v&ZBJ})(mkq*s`V0(O z$4n+Zb4GywjFL=`8|u(e@d587ZS&YUwy!qB0T*r{VA7BBoCL}{ea3=n$X@rPS}sxa z(7(b1Kge@6qOb(gq!#N+u69|WUqFa*bW~nKj`28e5qxkNYH12Z_SP~3mraBH003nZ z=I(361I0t62zGNXCN2n#p7IqMtVf82hNF@mw369QuwDr1RDT*`Lc^a zB549nCI1gBqDdo)dkszBbbl$QhqmT(!I$7TFU9&d&B5ToPGMk0JS+6@?TkR0XUW;= z+WPt=2E*|BbwoR5p|MRG^}4|RQ#ku+!?$Ko^ARTdJl8;M((Sm5)asJmQ)dwm*I79k zTTpBCfejlZ50q@n=M)`Xc{`9$5mCd3KDwuWyZ5Q+=x?t`}vPoRyQ8!aY7vD zN$Ka0o69-08Q<-fTjG{DotIU8_Ws)?u(SG;I$RrtLQK5BDc=3vw zlu48n!<)|6KkL=Pg`V$|-zdl*w^W06eu3~#zqSJ2{6-f)+I+|K7=?Y-X>j9Uc02Rf z>9(7@?hvo&p+u@}XGONe2>stROvjHzD;8H%mdnw3oQgVfr?u7Xhg*t{$n>`$(1v}$ z?>Qx5i~Z{SjytV_VdPBpjU z=@v&WL6^@P;y2w@&fh#}?8kREWuwg~SoUpTy$2)9h#auV{WpY0tiwwAKz12Z;5h8;JVA7;oY7KYhczUAbDI;IT z%VH-6hF0{H=+L7rVwE{<$z6O}12ka57cwfY^6rA{@fQsI1R&IAvH{|be5!U9-(DB+ zrfrVOC5>hx{kggwl;H8D!DTSH z%}k)07=U0PqSIl4tin$P?BPMP(Y{ce?IN-mlcp6~MS+7zR`X`QJrAhXQjE=QVp|=+ zi_Zf0t)X);x*(hv9K!Bf2b2aE3IT}os$_HY0|tAambZrmIZ{X>8DizWXz?y}5EK|t zO+3{A@i7(kx+4XYO=UW@dc1T5dzA-{f=MJ2R4S+#mLRbtt)BaB9KNJLHFE?2k2-Xt zAVBXUJHB;B_V^w&S-?dC{f_Sf?gY22MWW|B^7CqS@;x|uX7d=b^Z(MdwlMPvCs&iM zBQ%EcCg!6mI`UA7R^2{<=tRmL%$|?Ov&PZ)+CJ+Sy3xS{RUwf;Qy6`oJG&e+Q%PbC zkZigj$>#PsoK-e5nF_s5zB%uoWQCe)febv?n&9H{3guyi(Na4t~;6iFkz@lhyGWnA*}*SdVg`VNF1 z^JjAT7sC#N1Ae_dHp*)R-^N|<)CN$IOu#bfBhhmT&=IPz)7_L!B17;UG0FE_r{TJ; zfrt*kOluN`PVQ$tFVSGexCM_axya6WlcB+eU|#Ww-I_uGK-f91?7sZo=f&?DRnJDwHlkD zV`bF7PqZgKAx1el9d0p)S11cm(q2JRffvyvkN6Fo%Xc%!=`xOe#g~t*Q+Pb*gU6K-LI>g0Vs^=E!u;N4L(l~ zXN9(2A1cQD$(^<=wu&1zW2dSVit)0g_`kzGrF^`U(nG6r<{pv}E`NTl{+J4`s<~vc zbqo$NwL4-P#y*X9W%75QgX-mNqj!~AMZ_GEC0Dx^8bER?-;EpD4E#rL7}W?hwukqu z3OJIG^IN8Go!xjWue}WMx7aPmo=GLdMxa4+l&Sg zD|+016%M*)>uct;=hjcJ7hkApz&kIzWqqDUz*$DzyAjtm8fo&~mzxyGA#K~vdlY%~ z=6L9H)-s#4R7&~mQ<8O+EF~J?(GIUwtn9luXJ3Z^2Z=_8X6zL^&c|OPC0?I=9RfyC zIf>s3Hrv;(zD9OH_k|gj(mUp)3tt2BvU!9$_MUJC%Dwf+xLGdCvuqWh%7k_l zw>pm4o78Pyt5>T+uB^1Z!(oWrquR|mGj?FrO%53Jbb7OEvN=Huc)gqm#rrZX z`44ICV5&lbb5$_;W@zTmpS_1uS!Ok9qr96mXzGss8pY%eFRMGo6^&)EBVDBA~!igHO6)gD41XV>DlC%a9&{tfiAKQF!G4t%+dLTG2akfY{G zJ%5{a=*OTBmD`X$7!SAU{9lXjzkBg{SM&s5_|!zjQ>?4I@JgD@joVNl^+(0Z0)5QqWTo zNifwBQA|li6fp;&Yz-xFkj&6*;H06LNtl=+n4~I-0+J>wVj^mkrh=&o0w({y!Awa} zNBD5)qM~7<2#FxSTK(_r;tFW+2?0NvDeWR!Kl2UhFjTrDK${g+RS^P22lYHhkiB93 zh5bR{3?g+RKNx?H_l(Sm|9mG>Q2)A8@mA3g|6UgVegCeX>5aij1xr9gBvqg&7L`AG zG%+W%3McQvf`42O#y+q98o%_pT}IS(&J7^{z6JS62lPNC=MCFCFI;*o8@T`F{|lhG zMR_0!oFIUnk}L9nL;g@9+=tsV0iZMr5!QJEC5Na8ZJqES4aSzxun<~}Au6HI+6*Jq zhhDjN!$gmam=q~c#Hq>mZ6g$db)L8#bEk=@A|QwqrAAxBtK(%Vp8LXlIe_3t zM%o1S`oRH2auTXY52FeG89s0yVnV$!-7{cD3e}ocgcNI7!5G}wCPxPDDFCR6oq3+6|ptoUUcmJQ=OJq!E(B?S#R&rvuajS;DP z`S;*Keh31g{eVGHL8V1MR6!1@^2T~-1sstU0HfO{edWkmJmp za}hMX;2V(nG-b1K*tz|IO~pn+QK%k6v=TuD3K9AZBHl!$F9Os!BU}RScy=?_Z?+%BABXC8&CRl`2_r4u z^^L#RJe*vfB|tVFqs|t3OwNHd3AFT(^&5*99y-J}fO00Koclbv;0p{&qu%Gx7l$9K z(rV_m&O@`&M~26T_FwNk z1PcK#Jq>{tgnUB-GyARvdgq%GKZ&XFc9AxbBBGU1Lj<-G zGvg;u=+=(7`Dz?{J&ZnYBYbjLx169bss_9!dMfXCiyqqvl7`rGx}7lMz5}KVuDesS z2dH~Rf{;Xt%)E)2&KYSHgP4b98Y4yW95mcblWU+~@nEtX!?) z@;O`9Uhg-j%)2ID8O|K(_sjh5D6KG1h!ndD^&wRJ^GaC*Eh{uTDXGr zh;37`u7I%P7`J@&*o4(tK$OM6ccZyq+u6eJULaaitXFW;1`*ukSgZ~5O|W-waB^Zv zL~iiip6Svp$L6nolTWBgR$0o@b=h(pb%f{FS1^*=xZ$&9O9;VEP*zBCss&3?1<#V^M0|&>Q@ra=8q8ewDOn_Y z^TYc6jYa3*X?ou*ASgr76hPTENHcB~!LOguPaQtB=97?-V7nyx`uy}hx- zVSA8nCT37)4rcsMZhg+G!#2I%yNfvy8IE||&zOhaeO_OOje4r<;&%T}CQA28v5k29 z_dd>dwWr|*owpwP^=6|v)z@rSQPn)A_FZjWI7c&xYD=lo>aQX$gwI=<($$_q7Jl}v z=c*-pxQgVHpLc!Ec^Wk)I}Rh6>L#&UipE5Q5RsS6GRovmEpg^#y}j;^+zKxF8<(Z# z-D9;qc=lf16zh91@{l@n7tc}l@r>nbn#MLh;{8+YUvb~Nsg!$%OE@ryjjsuc3rfxv zq>S5Vb9Fc+3+_ZAAtaJQ5SOmZO4Gkyv2^8iM=uzvC2KJd_vF!eO$c0Dir?F?k=?s= zqv^Vr${mETc*vA#n}Yo9@8~N^)B@0GPRkwhU#OeImkfgvQNcg zcMg+!hbOi7!`akx?$Yzh=y{etM`jxurif%9Es}jaEp~TRaTPvhOiQ6IFJgpaZ@M4V zXN7Cau65f7c^gz>Am0orRI3!^2?*Prj;iaFEcMNJ@cl*2xH_kf3$E`5ss2R3^Nv(! z*t;#`%*6HT>xxT9wDa#9*Oa`AR!$RP8%#oi9o;|4xR;%M=RV-pcNmXr%B#_>)6v`5sp6j`o@MAn^5#>?-@TYvr`%TLr9DpEM6Rvz^IK7rlfqby zJl}R&H^Kh$qu;nsr&w|w)1;4e^r~g75N+ShM&+FwQ9RqVJF4G~OgWi~iEngv0(qie z5I&}FMz;-{ALKhz#2bU3Yf@)I)sgg!nMtNr|lkb#`;}fou4)5 zq~DkGwbACM^GNa=@4T+z^OWcthjaazUs82T(ztC(?0iQF`4 zA1elKLBC91(pM0XGT2`7DWvDT(YvlrI?h~cFD-}Sc%|%Pc){9yKHtW7!CccqmPNwU z^G_S1Ig3*!kD!9S?v<-7&L6Wr$&^Pc2^sMpZnLX=K@L7EHt5nm<;!S=4O~SCso%XK z>?v*_aVRBjVo-|R#=Y(-3Q&7)CGMIwd(S;v*H;!bW-~`K=5H_lgV_Qg;^gQJ;C%; zbj#)>q)K;o7asj~!py!&P&gUD`=H0Gdh*|0VwkDV`DvSr2f+r{jAG4G`!^$8K)f81) zfq{UV0|B9e32N=K3!aR+3|X|Y;*j{&}lK6$Uscdr@YqTvY%jS#|om#c{( zK|-kv?gKg!P(3U;SIumzI*&Uo)ybLBR|;fcePXb)^jIcQ#!Lu`Vf3*+ykinFj%(iX zP9NZSy#WK!>ojyP5gsH?Mw_{SmsS$dxljy3*v3hByEPK_jG62wYW4J zH2t$?XR^VKf@$z+_|2YSKpe=42qyS!h!Q9vB8OLoimf&=amO5F!>>jMi^1;)JKf-| zeEf!U+DeT9Z6NVS!w1ZK!1h44x^_<|vxv4R>Dc-Di+S@N|5?$Z-l`DhGudee)6x3B} z3VH2OAXBnHvY;uM2{RZg-X)`j&#sBa3CX{Fn)U7OTr;QL&5c1!Qv#x%(1Gd0P@d3H zPKL(n4!R7SmuwV~37?0PgUAjRWQaS?leViFN>K%fOw4dhf_uu)CnuRi^ml0WE1uGM6ygQcN>EjFz&PsR<3DyK!Vubecz^N>fk~E1n9$Bokmg)A z^%U-x6zeDhNM<=$^y}}vxrb2kp)_JyYN@h}G`QJK7-!2x@X15z%t1vG-BpvlnfF9$ zcdu;62PZ7uG{daBJ7%6TPJWq>jmo)-M$AkOiTklvGb~b%ABDLn+u|V)oe7UT&fMzt z9&PHi5sBvOa}jzVxHeV{4_C7oqO&uJPfv^lMrZe1BisWI~rt_Hyr5~QfVFt zO~xoKq&75>1TrzZNN{mBREHK3BqD4Cdm^UJ)#wF;l)P-j`#{K@uS5^D}w% z-dvr#sY9h{_q6c3O~)doPQ1>qdBz$Co zgqAv&M40#J(2(~%8LQ$eX4-r7LXWLdo(=3lR};xUD0(M^$G1;5F<_064&%EpnT*yE z@0Hp;EZk$Ne4%%_F6brdO5u&*_i1%x-`j>RDtAPZNIiu_k z0lMN$&wCk+$cgGyI5IA;i8>)7oQG_<9?okA6Oj|HW|WaC2E;-nN`yAl5`;#*B$^yG z1bj^m;?_riUmIAnu)(+MA*EjDYe z;N!YKI-!YN)^PYH0VZk~KPS=;MPvi#kehT>Ma>{~O==twA8iKdM8lM5Byp}%=;o6s zj1($sM10{12C#68mWeLjULdk$O|Bg=JS;P^j2gS%Z0zNxheR?VLdTLsg;XL{DkTV! z?6((sG*rvOJ2?0xbiFpvLzo`Zc-YQ|M43X{@Z~&o`_gmU>-!DuCJM27goqOp5jIJ` z5$%nr-sBA&lchKgORCWIVR04?xrESj91k6KUsv>ZsRuUzK2A) zFhGpCsO3D{j)wXz5hE0`Dqgsk&LEte2ar_qB)~*`-jm8z#&RqzDjuSYEjT?3(Ln@R zU?mN#(7ZquNp8EwmpKL+%^GOqMszr#vSvpSgEX*-Bd|c{97o~1MeMe5$j=m%9&hw} z4a2^kI?k3g#+vQ6$YW|7RPiW*&wY6*W%LA+ge1Mo!nDqr&0umH_D6zV(vGu7rMP*B zDdCDNH`b-{NxKp9`5k)dn&`CTZ5>?D=(#C$4pq&=wV4f^91S`$*+^aKaVe8t8PT|S zM>P@d4K^^6i(^5;V{k+Y)e|S1aAw~+f?dd3qb!7TPUJa&Lj)3cIx3?gk}#AHT^j0~ z;F-jm59?!9T8}3rQId;TVgV!19&->qMaazeWCuan$D!abCtZ5?8oE9e7#}F~%RwAG zZ=e88K(fD}dfuB2A#KcBbmV#PA6)!aBcxRWu|W)DoykD1|s z^lCoinKRRGJm`vCl&85mTK8FIvaCUL?)e_Qt|O|NMG5USxG1t=$Y6UI zN=HNl*&~w#55%&MJ|~-4cfhsicU09=Q;2ZtyNQ-5B*2q0LO^AjQNl5V$&%fq##yX` z(>KP|oY|RZ$-6Lp^ELc08(ZS^vUh>o&$+Eu4>n|-C_3o~MfLAYncVf;F&VBEZ8BA) zC&5}@7-te9sJWWV@{%-{DJka?@y@+^ySqQ2_uV;!GVin_B*Rg08ZbGh^vkVW9t-e4 z6KM${NpFp!wz!*ha3LfMV}LoA9GA^F)_y+64-_>TJcgFw?*^tqh;}sS*)oxYej{fl zEWx&b*nV`qm<{2QQ^neBNpc6I8X(DW5Zg5y{?Z;0$QY3V#*Kw6LDGuCK5e5{K;ed<>^H3pU^gI3>iI~T zQI3$7_63}c$wFNbyrx-TI?d++Q z1)7-qk14n6L_mOm%Yi!+7C~gD z-R>$!u>ve{hZY1O2q_346apdBb(jZKZpm5SQInfk{s6>x2Q3#J)Ey)~G49t&0TfvMdAS1Pf z8N_7?7BNFzGqFKsUaH4E_mtgQ^_}oT(&n+=3?%hm&?uIILot$-_otAsDRb+^a0_oI7SnZ6{2G5-{AM z+u<5bJaHP$p7Q=fIsqmMOu{YCMF}9;*zC3B$>^ZQm6l>W`IBPaO_Rnws}PWb%uc#l z>82YdHe*7OjAhA;CWAHP5LEhvZ2M;^tz`FuvJgTL^vE@W!cieNE((tbk zu=L#X!h1~VAuy&XGay6MkYQmIcXMyI1Ph~O7~RSsu^K@9DjUO3J%R#o19bp12{6nW zIQC}<&0|E--0^4Q;(37vUHH=m#DOMA>AVjG;eF7NA%vNsa8Or;c>1%Y7+q9x$CW4@ zFJ>YK*hwyXGN8Q>CUhYznfD!Pv(qSuDDuZggLsH)@&0ztvbd9EOwp+gCN!|(3Oo+J zI^Jx=H8XE!h_q9}tZN#B$Ht;_?BTLLVjFVXVP3~;7EtNJN$q@Z?@rOC@P73#nk(Zm z50>DD(;>L}G?H0hY_QYSHnigL)I0?9qA+VvcvmFw!IA zE@jAk@a<;;LFhSrIgF74Mi_FqblE<|^>Jg*qsp@<8yKS-#|~({ht8I0da6 z+3R|6@yKEd$yj&y3}Eulk32IhIGKyf#LihCQ%;CH3NhvcQ)dRWE>D4zb;rR6hdXAA zSPiCx)t0m4*!3i82xK2+dx9!o+>Vb{iRrj4kc1|dc5uRC9EcoVOORbT!ts)`o-C$Y zmD*H&cRJ1QgznL)CAAT<9&9b+a*?{kR^8JiUO5J!eBogcMYv_%zDDr%+46FI=e14j zVeQo(*mD};rrUb!o|BU0CUf5?kFY1F9jC?^woMp5k8Pxa6ITZ)_Er6}84C=Ds>3IF z&!(_%dn0*1acQXt5>90K9t+);<^3>0laz6~WF+D7yrTHxa8TOt`3jzWch<2!n>};i zylXmg8H{9w_h9pk=g3{rnihu_rX!7qPNPabe_@_GatE&vQPeZ-dB;7c!UNcDdDyPw zzE>*PgAv4h!aa36rgyVwb-M!aZ&{TQ5IopkW_KL$lQAl}tT)jPrnO-l!%jGwaq>cs zNuz=UcuNKf7WvTYgf6+?R0mY7Q4JIaOk>?X`Rs?GK`zWekiDkp+Az7j2%o0rl@*@a+Jz)Ce zX+X#mAutx3*t61NT?x)R4FX`fcC%aIB}PQ#PAHd&Ae1;^6o^|xTSb!x#x8MCKS&^O z@_6of^Ef<6W2u_uV2Wxy%p$2sfY@hYxz7%!xY_uI72gp8k2``S~AX z;w-fAWna35irRffBVEJd>0&j%y8MqV^1k1d9_x=2Gvn7^&mss%Xw~^0w^N)w`|f@F zUuHE3eh_m_1dC+xzb_9TUP#H2w_ruWG@#O2!Y;r|#J2!<4+l4-0Nh0U1es+4_ldvH{Q$X+NtuL9n+ik zXBxsvXDcR=e5whc@ja+hx^+6V_jW{QCi5!+vBn<6B$6asoYhpA6Ps6QW(wXW4#=UK zVk|ReByO27!~}*5yi%uh1nVSSiCrdrW+xm~%zGMbVTAoN0JOa$?eXmQWHJeTJ%OBKgw zM)oIf3>8)!F}bM*$bv9@262a7VsQ&%BvMF(c}(NebL7p$X%GloamYJIpzQWpk56rO zZEm)kxG;Q6ODNJ3NNW%y(doV{fLOD)-yO7v3w-Y0O^^=;5cl$&Ji+50)*EcP4ae50vCtGc1g~xv@l{b8s`JbdzY8Ey?vuBpg$j zgC_~p=?F{-y>y!JBslQw-pJ*OH0+ksM1$?ddm;`DS7Q0rpV)iph{5bSB4Lyrae3;$FJvb+_OFhcCPt|W6yO2(AYj*AYyT36G0R@ZqlV3W{z#M#<=e{*ba^ zp^@VrsR1G^Ra>}9TF3(APGQ)j)Wm%^99_eidew7|#==C+CHh=TONdPlVC>10^Qj0D zOvet8!9rg0HSqznC&UoF5O|P?LmP9!LqdfeGeEv#?-+N7gf2u48a;+>OS^gMh4Y65 zZMg06*w}3HL|YDwGI3Kbi10*C2+-r2d%CAh!WonVs6qv6HzEhIs*ui8D2I(Sq3EN$v`=CXD1j~{OB28fmA65WjwY)z65C&^W~c|Pm0i4a6@ zrZi}-iD|gWtVN_~HHNyqOB(G1kq{bOY#yOWqFFS2tjU2gKBHt*z1tFotwEwmHcb1z z3nesBht>e>ra8pP3y$akJF}sQ4?cePPv5>(#F(wdy-V4j6CV2mh*Z5Lz}No=+S|gqE=q2tbj6+PP0%tVl?jMiQXeF&QgH=V^5e^fYkUgC?;| z8x@P8_%|KB1CNv272;j!B|}0?<&2p+IJjvhl$l(BfYns+Ltmg{dN!XwSyl8Miu6d| zY;oZ99n9=8c4xnAY)YDJ!&D}0(d%U6bfd;Xnf_gt{IyD^;D4Q8G*z#N_+-h_;h?hPeEGsLQO%Upkh#yOf+jOF9A4&A@0hsteU1c0 zL377xnEApe^-bu9hwd|6zHZMQ$z6?Wrgf;I+hxA`^~U3{Peaae7hLko`ECevdjb zXAEJ=WERC&iHDsK*uYsP>97ct?p#)_yvw#tlv%vi^iz0OnOIzN9d2NjZH3KI4U)k5 zcxAkSz8->SkZ3hZatFslgz7Y=2xyGOf;HU017*$26r$+@h@njwY4=7ZAOnF8SQMuW z{EMSwC7eN`F9bG3fF}LudqFfngb>3Y1PURd$^&Sv$VFTb;v3HqAD4KdIhqf2djwL0 z)G;3NL#eBy)|s)x+nr4*K~Y?ap@^AcSg2~Iq+*GZB8aAfDuNh-f`VzNNvNt4X(Ax1 zT8JWGh=K^9q^O{#fP`sA5{f1Wq)j?9{~sLDX{<1w=zlBoP%XMG;d^ zv}#ypVk(+xs-dESNdTKpB=d#hD?G%mcbeXeVm>`r8rFX6{kPUGyjbLU$8+iXGde!6 zo%OuUAAD*%_etisZ>ah8JSQ@}li$0&3Q|0i-aDtN&Fo42EP40Owj!K!hMV1p(Tvhs zJ@2R7j$}(_@>gcPXElQ-d-3nb$BCcF#73o{9vd+yP5B1B6_{0roi+-R(edDstU}LF zzSpmXJ(Ie+5d&-cbseYWl&#&f-F3n#=@FT>w!Z`Yo4IG)nhr!aFn^!M)$ zeVp5MEOgd5d*|H8LeDJe-k3MyeiIn;$~#9pUK5?rydZy1gYP<(9rd~LWQ@rflfrpr zYf4WiNps8{!q)RqJ$E9uL4IQ26!}#0sq=T)V>ut+EZx>G@4R&HS${d2`s+HJMe`oP z_hZ(+j&P!=tM)~cUg+_NGHSyZGJ0vv^uhB!N8S9>?>nul&WQKCb4!UT){YS$8Yg!u z2=m_VyykrEOG#Okw7&Co9JlAC*LZNpdVQmJzjvElQ)c65USHSWbAE4}`sb86NIpep z)4^o>88ZiihIQPIPd*uVdi;y&_Dvlf`Swhl9Np4b@H5Qi>rtu4d?RIQGc0B_dG1>? z;equ2#TFW`2l{!B46JjUEX67_?l&2Fd*8onUmW++`^l#Bzhlf?Zy$ZZWL?qkpKo|n zYd}}vGhZAVvd$<#`Jle;OQI)5G;_{+w0yQ8}Mh-9uUotI`xkVE=s{BMQ4YP zOo<(M*j6HVC?^B8maj)Jl2Y={B(z&uiqW^VR6DW^rSqFXY`MQ-vLxSDk{!ybH>gIJ z(MR>O=EV))ju2$u*v-$LJxWT6AR-zJ!kIq{e3o3cj0a$qZ2Q>E=tlzfwhJ z!%-&SabP)qjZ9?$Q{omFrj-L|;aEAyXd~TYMvF3JmiK1)y!e7zr;l;oEM>Rt+gIg=z5X2`P29iS;Xp~^Ao!dg&ZFe6P!sWe$=_{&t=vy>s-m!rSL zkJmneQRKJA30*}39x;p?cF~56xYURo=^T}#4SPW1S{!gv3kmrrq`Z7rh6m%e$A`)5 z(50C-&d}5&C4E$d(d~(OAaOYBZA79=ZRaONkEsm@do<|928BCma>l+%&h(@tz%Q%<&8M}xTR z?px$ECY_22Y$jPaP2sxKM2=aRwxkI&Xz8Xf>nPira?uAo+!EW`K&Nd^*Yokxbs_j` zhMsYcAR=Nxkpy~F4+exgdR2^Q%1K73Nhox!KC43Z%h@c{S%J;^d*_BV+Kn6b$34!3 zk7=p*@eFMw&^cr?o@0rF?IhtumUGtxCznluu3&shtQ+u+VOOpxb)yh+iN}NCAVLud zv_qPL19av`D^6p$$1fI^H@tIx(II9|o*y17q>UCHd$>#C%iy?c;Xy1rXi%kzo0IJW zVW79~4*gv;KXmMxv!f?_of&xZY%znsTGa465DYOjJ&51jhDD&Qn>A z>akFGi27+xM~V>*J+7(k&M$D*33N^%OoI?f*BLbUT>w|rvj27%lC?

    w;Sy9H zFMcq1O&xG;5nSwv36eHK5o|*b375xYsU&=!XA)q6*rb^pqMT~3?2|-#KZboiiPXG-KITT>xodXpGe99CRvbiPP0Uj9gIQY>a=jw zOMGRaOFCE)soG@J)5EPsj=2Gh@Ix^%4a-pS&lKd^c<(Tx)`ZRh>cW(`y1`NE=;QO|s)6WMs zK|u})0ysN1JRIddxAYu5L%h5Y){iWQrx23qq6lmN<_v7ur6883=$j{xO838zd5sYK zPQ!@qT$SESc_GW_lhBfDFl!7Qi-z1elnx-F7m*lfGFl(Ia?vV(wg+b{^i(4z@L-bwvf&1#fkTzJbm=(0nWuVzYdy^#E@xRJa?oRTMWtq;+;I0D z?cfZ%fTbMVLa3ms!_))nx56rJNYRewoSY%p%4+jjy-m?iI9d4x4St}UK5$V4G zWhqus!y@2K9wUCvJ422lrOYg3tXW-9MjRa3VB~2gWepUMM=`Y~{m5iIa|egSmDclH z;qHFn>EW~{m&2!6;vb$0v{pAUBqB$|JZ6LO&xjr3GmZF$yeK9yhb|M z8oMkWVKf?r-65Ez;I2sskd892DdSRi;MPbuV5hMH8^PTOb7@Xw+mj=N>mk)oj+4lV zAE~$}Ol1_r>HRj&xIRp7G>8E+d58EDPvz?s9fl#MA1Go(9tjJC(NQyt>sb?QV&vun zRMJ3o1k+U1E$TE7@=hQJQ-X?fWwaT#T8Icalz&tti`~vp#~?A zHxn{N&HW=`0EA34vpH^CgecHZ=!NmYMn#bWvxk(IH_RqQ5UxL?RPOTs2d#D~c09oG z>8BwH-IF>c0uzup>-Hj0UZXejlXIL!WOx)Lt!b6zhw zZ!FQ)#ryWoBY@|F{7=LVJ4>2-#8T(0F>og`B@>L1O-T@r3V1m0*yb8`Ntk#zIc=B0 z@uNhIkszlB9kYb~x`%Y|i710SH4X9c;kq*d()+MOF1vaWe3~yU>YEQF;X6ws@<${V zUDH$pl_NL-D|3AqiWinY@Pg&7MUa6?}Sl2kcI zj;Dj0Lz{3{M&u@*?z~L*Qa}_j6cGe4uq-M~4(xIrqnG5|TdqqVDqi>vx1ybLK(-Cgi%KnLCe>6hbS%}mdH#VPR|3OHgPA7VDv2z&d}ROHRM*GY7J*9 zO33Xc1DaH`i4+hgw}M67Ixff2O>NU=joG$)CvIF5WNvW!^}Tj4DI87dJ;+3F{ick=x~CD>fnyB4pi2($P31p-_}DRUzSS)-#`5 z`9R)6m}`FwkbT_snQ=Ewu=x?cy^d=9&Q7N-VVXQ20?T*D2uvj=4|34(6c|CKvqTv< zZX!*BLQp40;jsd@*`HS)0&h%t#}M}25i48^V|z$M$R54=o(*u|@=nsYh~@>rgfScs zOADerDK?+sZ9v=B%Ny^vUum@a$tI56DDCLOcMM3d+xUm?T$k&RjUo|*Rvu9JbJ@_# zHm+17opAYt_cg~FDa<9Ow5Ml6TpYq~42OgTFi_fP)29vwJxoieUIiqb^ZQnU|Ao-Gtk9s=Hp^+Z~$Y~06>K1L(Se);1;-uGzx{AZo zjw;Ej=~*%yi!f(|LwzM46vHv#ph3~_`S+di4z8dyuLuOHT1qHpIw5fcNlgSnz8!Gq z#NG7e1n7*3AcTpc1HCDQ!CwNy3~H5`>20WNph9PGtHyzeQ$wY>r-T`8L?kP@B6J z8_ZAWZ>DNK%vqBt=qFN|dWaN>CCa2KRf;`w^)C*y<)3C4<(j*F2*P zdpWr%O(Ud}G`>teJ6mal3Sm5*k3J6=H(mC=LN!!H#qlOI5f1(RI^Or(Vsksk*`?2A zw7gz*H3Mm;rmZN_L}Zx-@pa78caXD=d+Uxlm7^wdvPF=Pl1CXuA|a&5R}Q+n!51E5 zO|fSwDplmgnFT9hgjYEz|Z+&6Q*0m5`l9-lD9hqe`HH}IW70a_!uQaY$ zE-+A5a7d+`80mP1a9C8cptRsP@Cyu}k_bs6CCeu5VYgy7JBUu>=Z7ho&zy@aS3*WE z*Y>6|erZ9Y^YJ?geJnf)sHXhH!Qie{qK!+sW127Ua>E6^M1%+=O@j%&7{e)5AREZr&_dUU@w}J_{h}ftEGG^Bfcc7o8Ix&2H7Uqo^kd& ztsh67$9J6b9Pf*RW5 zI(fG={0tOtpFh?lS}=T%dRE2aN3WfP{;+dSp27;JZ@ygs2#j(x)TdTS<|g0rQn z`ud*(o)G-C%n&1c(>QkNu9?HgK$#`w>ml%s?DK7(e1qzLa3a0*Xn7vI_HOHQV(-GaJe7IgWoLA&Wp7iIvpxKj(l$|zp3VM_@$xd6xPYjaDX8V(! zqUJFNy)&eo`yIwoGgfNxIz2I5^UQZ%yLOk5&koDieVKBRWjL&T;T?9>aeUQ*HnD?e zT*2Q+JA>}wYW8b$aA3*UIB$O)){dAl?ew}dh~C}vLW4pweVI;qsm|lx@7p?I&?GSa zcyv1SV4OJzly?x+J;^N;csY{YyV3l29C%Ja$Y>QJ%#@RFSd&UHN%6v@+aeh_p5je4 zW7UU;d5)}QcJCR_m{U6Lr(4X|2Z@Y&p8M{p*4jQvc5l)2mM)TCbfc4|&r#XDS@sI| zn#t+xeP@lcr-n<}@uOJbZfuUwhxIlBWQVqVkoi~QWQ$nOu?7!}w^;_zvf3xvKJ^%D zBg@g)*t&Wxt}NLdiphd;d+`x%@@#8yru5G@le)pP*VvD;Z8-;aJW=#x8;mnak{O(Z z5h!lQvF=AjZ20u7lx46>84etZlTt`w3`s^kI#$~_!Qq}>h&W(y!CE6t!u}yFSXlxi zdNM+$e3>$y!lYzi!4SE=J7aXnPs~kdqM(SP@p`nW!B%$?OB6%C5fw2p?$?*h+G&w! zd=GmtH_3)*6ETqonMfB~HzBp=JFGz5);+j`enWd6`x~<~yghZJHc5?@qu@`1wOZGC zSSvgp%=ws?9|y(@^H^~^rgJjhn=Zne=Xhrh>k?k;xy@mH^trg4ca;g}DQhph+$hGO z=HgK*GU_J2|C#Ov^Tf^P?^n&37~RZoN_V<}v2fdG7wt*M0WwV($-}=hYNvIo(U1>t?aj zyEA$?Xvf5rvt-eK8$B!GYs_GX^P`(xjt+Uel(jy`B;4^oM1+Kg5l}@OQBYj(JGVV~ zJ&ovPy>{cFIp&BfyCN1&7EC$I$UBKMojZKp9+4oA;;dHmXSgn;e$pG zbs_22%4CE{QJbtl`ZT3{jBySm?mx3CqlskB@ZE?wvQ|}yDhgo3J>76KG-!2E-IL$9 zh;amLX6(dGxolTcFwDtHvk@F|W~dai1<16Rn^_a2Dn2bVn$s}hwh`=|?9C={=RD0>nYP~9 zHOAj8@RG>3X86&)5nf3ZU8GjANKHweoz|2c1xZK+jYY;;$xnzq=XZrH`z)a z%Q9XXEK)h?x*P6zwrJMY9ie#TCTNr+nTC@G2rS_lYZ0%oj%CA-B+qCwB3lJAL70gg z@P$jM6myucY{tT%$waP3C7QXb6c;KxnOel#n2obEI%^#!B72jjgX=?l(8VvVFp4FLJVV(Bb#@*y<5CyuD7~^IiU#b zOql5u>#3XKG26kdI9m&?Ygx-3w(C>```I=PtpLdLSK7O3s_ja(k-lg+xZYa-~_rGf$ILz6*w|D#O zO;aA#Pnj3hpFGbW!CWciWb!$<(mX-SrS*C;CS9`gNu-ZW=1FI*EV?169tzSH>9C}i zicmZ599D-(G($X+C0}KG>E$0ocO*tB&s@W(j^N&XlQ%wV7`RxQ*5)j zy6*EIJx&fycN|T;7Vi$Xy^2z*UU_Q~Q-{ah^VBSvMLf^nY@T@-%=td8^W9)MiPq;; z_4($zpL_NDykp1jjvnO5=zU*Om_(*<;iJtpYq>}uh}<2ILtA|N?z67vndHabPG1mT zn00WkT0$2E+7gOSMe=en=Jjx48rc`$e(qz>qwlxXx;Kp_%d8}OVc?g9y(p1Oke$~N2!#3b*{A2-wQ={m zm+|%PEqffDYdBn!*~T=N*orxvbDDexo7ZjSR4;wJD`&Iq?XnVKB-Y_k@*yom#HWQ4 z?jC38$$hHe|8pb1yVqyx`3j-yPew7C-%>%GPreH=UH`q_=V;cF+0 zvtMlcyvXO%o*sP>e;An9Bq(xj)}VX3m9uEYYl{!Jy-jUW`_6eAwXJ5!S@vo$Pa>UN zP4m;;*R;Nv7kN>AF~0X4^!tl<@5A_Gc<+mo?7yie_IZALuS<<)Y2VBaYI*M?TK6&H zUl-C|yt1{FcX2)=g2x@FN4@(5k*8gVoeq+a^SQlvoEsR~b*OAkEO_E&+PSK6bxtb< z9^1Rk?w5&m1a|1U=YrK3vEpIx7}@c?uTlMet2|7~Gas37(r7{XkD$y$)X#M<`9YU< z39P_nG-*39=w}l){oTK>9h;w{$4T4pv)oI)ao9RXJon6RaQdGsUH7XM>f@63U%RZo zsWaEvolhz6ee%fmD`%+X>xwmw^L;+&zIUEqzi)l>T=;d_JI+IWuRA_<_F2Q6+LtX( zu?r6nn7#;qzTK6Y_qnb8s*KT?E;gc_&j%k!^xP;Zwk5~$cE+&9jE;CgsU4wZYsVp* zQRTm-N^f=YU9yCjn3;?s-t_c9!wFt2>bv;DdD=9Y;=FI)eY|N2c(A)(LQ2fQt0YbQ z`j^HRF{_oMGn!KE3L=Nh;$+*KctTmOwZ+`+Cj=eV zq?t8WO(iRJRZ8f0>|(3I?D0-DS=AqAY?~A%O@>^x%1p;l@iE`*WAaiz=U`QF-j(smISG#xuX2 zUiH=W*FpRfp+4*b{>dT`LIRx|#o7gcAqx;}L7{_SfLJV8>-YX_b@zbu16c=A@-v1` zq3WI64~JJf#;4debO(oJR$^8j=QH1&ii$d$>No)O38q70b8>h~_>xE@lY$EqL7?1d zPY6>8K)-`xY7gxFnocVkLs8_nuVJ8e5ZGh{2v{I)9SrbrelK{$;iPwj)?Y)cxCIi3 z6evJ2fdhc<{Xf~P>k#G|=&I@l5F|4YXqXQkJl>aK{{*#b5v|1PG%i zhCGnErI6e!j%xrwtb^n%FW~K2C$9$L;2^sc9m4`q7C;DDUmdZ~b_xgZQpgW*1Cvfl zK_pd)G!l~dHXf?$JNK=C7|X7vGQ4;91W^=y ziPBL3w>}JjByKSJpDi8^9x_d|0$3>NBgYHH(W==veMt8vR}FaCOFAJYuQta#T$nJm z92IL@==jmuJi9>90RuM8chb5A}%mrKc>FtIxpSKuzLnpA;l92 z9$?|p5^(Ll26?+}RO^{ifdiljL-hnO;ppH4)S!n6K{-%F^~FN@ z`s@ke%f%0Sif=7#8Z>AU&_HjE0PX$VS;UYB9QUw%?fWXM9(eiJSpnGCpc%a0%HA)L z`LE00etq8Q_APfg`^|2QJbn6*fdtQk(cp}5jw1Gl`$(SPVcR>HA%xToF_;AOSqt|? zm=}nd+L0ez_w9stKp?^#9WXeyh7D?d#n@n7xI$1fG^aowcg=bEVN|f0)*wnjnK%-J;H-ZUG3Ww4HmO4ieOp?&v$`=4ReEvzbDC|y`UhTz+7pA3W` zNX~dklPL&E2w%zT^X+dL;grsRI{9~RY(5?1?$))o6}Qo**jCi3@vUoG+X~jTw#!=9 zwZ9!YZG~-xZuIH4zSq{6>8$Lkufbn}zRSJg>5|rK--Bt2tV%I4ZpSma95f(!JMuRdlUgX;$}NWnT*TRkW7U&*E80 zO4Bm~``FVwk%I<_(oS$1qL#P`&8#TkE15JH4^l+k5tZk%q(l^z1>j;U3kaB;%9N1$ z#*V?q-*d@fW0HEC*=vWFfYNPj~i(lLI!ySwa1gpzDy!)YfBf%0fd2bCUbiKSo3G>ptg zw?1geXz}BjB$7!al6(w1L(#Kl!^RoDA(DIp6ZgNqcq1lpnCh4wp_-J;lc0h>Mg#B> z=xz|;*k7J#d7~$j$YfJ~$Dp&YA7ki)HXXhcDQiz|OG3%ABmmR&9z&DPuE3$JAeJ|k zv21&YrR;_i7zKb402!O{z($P?6El7>vR89g&S4kAr1&iH0zw+XHhR|Ykvw}Jm59jS zTFcno4|IgEFxt}KJ{ls$fgxRoir*Qu*5G&)pr{^?m`WNu!%ZR%Qcv`FH{V0MySuyP z`pgvDJdjR4zgXLTkHPAxG~G-(>r6Xf%Be-rsy4W#CfgPZN?E^GTfp^v>MYy>}_z5fS{4aN7G$ z@33(Ec4uOY1?Tuph9Q3}eZL6c=O}Tys%q~=eu{y}i4mh!``N5HfWDmlSM5$cq=_t| zlUJ7)H?^A+IujFu9#4I|MQ7`2IBJ~Whk=8OV_;|+fvf6~e_{+a$Cvok>WEcm<9*YiNf{kNmb0Nu~r*ki^36br7%GRBF ze#YVJck3HD4o|N5cs!jJnl=u`jURkjp279;PYh6iQTFw=xb~YooV(le18|ZX2XLo< zzXzo8MIMQ*umK;;R2a?d^n)@%?1L(kHoRJ7w1Z0P>%b9_533Vd!s*}fNd0Z z-0d3>nbU*Wqb$JtLS1HQFd{VBHuaUm+&D0JeDEGl;iJ&*p~zr;lr){DCjR_!;4p@c zg3o-BLK*q3uk4B2V?R9*j1mb1f=AEKPm%}G=uLM6+F+m+DjvL?zi4e42oT_fMnZ@i z@~6=3^UX6O&=4WQbJ0iJ+?pK^Su}d2%ng&$a-Ne3gz}c2n(Uk2lf(epCW0n@?%7S2 zV$e{~HSfoFl@`cC5_L#LjM~nJ_emozsmcU9Fd!gX$>rfY$pOd0Cz6!M z7c^k*oSo~Vld(k&5eZ5*9W3<7gh2$H5XkwqB$E6O+u)K(?CsH$k)+YGL+ILyGC(J2 zI$&hNKANho6|@g?N1umPc=EnDUW3oB!pWm7);9>Y;|C#+L~$|v%^QyvK#|8Bav2c< zFhdwk3o)jQWXI+7H9s9|G5*+N6M3^jP3hfke~ao*`%tbPo~ zD+-5Lnb2swi%x!j0i2DHP2v%<+`wuWA7(?DEAcM>n-i*UOkH_2lyBHJ3^SHtFt%Zs zu?}S)Vo)ti^_4)q!&iDNB zocp~0Jm-C%bFTZnuKV2A{W|%UE?;-ZnT{+RTVV8>4E}^go4KjQxsM0Hqg)J)vi^Lj zDX5`X!c-TclAL^<2$$bod9zp88kT*_>X*ry*vjBQTSNptbD*Wit%TmT6qW;CooF#( zPl?(DB8n$2HhW$gANmu1-w1IwNPaFY!QhA(L)vyD34(Am*9{pzE*U{h#8mkV>3#+B))m0qJuPo+Ph6IU;*9I-PO>l&Z83H*B-^xjq-`-GCkF9enO`O9pxI)FCLiYHx6 zw&@j(KYS$F?_dV=#)9G3lxG2xFQg7`Lc?eMhuLk7fP1K;mTR_#s@Yfh=}DHqwS3Ff zPbg4uM)PU3z`ACK)A#wPf5Bj=!d;rvFP`yt9~&bRvNRZUj9$UHg&+_{SffYx^=`m4 z*JFV%D?`SN-IdPxivPto?~x38cyG(^efrQnvBEvG8Q7*H^_iaT*h+kS&qVBJ#dHv_ zc?rxSd^CAc#~5w@t)Bc#hi)G-a>keOy`*k$&{q{4gsPym!wo$iVu_p4#TM#DD{vF=%Yo_?(yx z25caZ2oKoLF3W%pDWzgZcOF;#$bW{6D>u4vF78p5$1eyKFpx}t@xA(ub_dF z;(<5Yhwxkc7+${udysC1;HPqnSJbZoB^iLBE}ot*k|U?Dg+yI=d#TpySN6S!5)p9( zPrml8n9XLa{;n&g@V}o67JM~g*5{9}*2z&Lo-Byr@Skgddwu!Zil{zT&AI^Ls^2V%JHs2@s77r+CS%fySSv}-mH-*S zT($d|EPGkuR>zBCW2(N^`S?eH&MGo0X(y+|`+2Rmdej|mGo!K&Ozc9Ouo4BT{PUuL z%7SO}`PsDl^arkK0(3)Q;)1r?g6wV+vHlo`YVqTP3Dfwm=+*8K#hk@(<9G|aj{f*r zWs^sECEaEam5{9W%~G)NL)@7?GvFu{nZBbDmnz>#0G()FD9}<6t_Df!EA#7&HOnEi(hBmc zXMKnvTg|?DZ;W<&|MR1Qh{fu-ws5rHiZ{)Upvb@IWMsxy7x|}_RQW;R{G3v^J}=%`NFp2{!TZ-o;dr{ zO+8b|Ticg!bZ$6Sj0EGQa-D0H9KB{L>x*jDw;!Ar=YGchn)UyZ|Jbg&ZF-oh{NBB| z!A+}|cvc+hy&N+9Zy0hyj=p33b4Kd1-BZJkndO?bKaxAsnf3lPFTIYXun_6OMI&R2_{8{qSMY&S{Pde%Fx|nFG3pGZm!w5WiBNz<`g1a}K-Nx+hg-hGdKOh_F z$IclYztr%&%XkCx{LP6>`@HJo*nZWqdS}nRH=19+!&64>p9WewT2Bih#DCkAX59t1xdz%i%~me6mgO_Z4Xw*VAajc1IIxQiHeVOP<{H3Ayep(~%$ zMSgvIOrW0{{e9)J4abacXuA4Q@Y~_vI`T#W9N_zfN9vP+T9cjYQm?r&em)sff6cW^ zFP6MBP78UM*l4Pfo@ZHKx8ZR}(`ERiYds7qoHanMM@j7G1jsI&$?4cU4tMF;2*M2u zsJP|GvfU?DJ%j>V2bOWuu~kHf!hc7`<53NNgWfsw{8~e6<0v)*$m^hSzzeV10)7QD z2L;s<`_HepJ9!@=T1?||Gc!A3Hk!a-Tk*$95~=@{bBT@ zY%AqZPmSW$>>F3gc?>-3CV;^Bf47ywQucCwIVt`)$;8}q1gj}TdY0Y)m0f=9L6i@@ zL}?>&U|jh7ta6H~$|qXP3ZIye5JfBolYo+-wMgaRtazpQ7CtT8qaR+)PWiH=Tvyw{ zyzo z8=ka;>5+)lE5B{3&E9w5_XWmN=UaY>B!RMD;-V51e&4;@ro_+uVmLr^vhfrF$`bvg z#2`-S*w0UAlCxDJ1f_e16;?a@3x^4|wQg&UzKv~yxMNDU*-1o?n(^!c~4$^%hdPn86y|=~Fp_AiH;ya5!2#+zr8|a7!JD+*z z`nbJmeI6tK&ZD)EsG#40v&wF!;KwmObGHg1zADw)O$+t;r*0vi`exK0*(xzGLJGG| z+za&n>d{8iSls!3hI!=BO+{Ad+R&r$6R}TX-f>ThFTeeK67G1?`>BMmv%8@X-BLTE za-Rux_P(RC0G9X(?XEF5sr9<`<M>w|ykv5ZTfpHcpi~s#u zF4lw6pPici{qnEPOwR2hoojj3@BUUNIl$f0Wmm}VdXqxW>Ow91p7L9Z2>&xQbtTNa zJrDbFr}R`KHfeNy3soc1)q8dxz`QgEQ!Xq&WtUF*D0q_$ zA(anp$@!;x$&Xh{=048ljC6j`^M&b+$uPqnqFUEGY(~ZJ9?zb~NE!vk(*^vNG&!Q} zdaCuTJ8BJYu(4a|{h0mXsmxF9tGzm*@*N319<#+&-<>Xo#J)PQ3lTRfvJ*ycHxzc| zeb8(1Jq4M`)wz0HMC*>!@iS3muK)dpr{5<(r|Aac^%ys0MfAF}dxUFp3H(7PuZfj! z$oftt_&Vkcf5cN6>NZHXVeI?*{`m~M*G=JIA-9j_2|6c|E3(rUd-e*PI#s*rjySu> zvyJ>~T|`@u$M4Gu8Qz<=7flP2&O}5en|fnD9#%IvZLa@|v>NrQuKrB9Mf$BDw%^8v zkLu}W=r<0t7g1*ySec1ygcf?|7s1R{9?=ya!}Hkwe&PoQWY~uu#GfO}4=oyYk(NK) z$3`UP2jcl@I6#Zwq|pnWZc{wUoeZr}pw{al+74Y^{PYJQnUOdq0vEN6bs8gC0ykql zyhR3+%=jAXgf4GJ$~Rq-=bTlF7aIUx0%3y!-!X#{oywM$)=h{viZ1fC_psh2D=_GJ zZr*P&rG8cY6SISwLxEqf={f)4I6G*GYy69L4z9#ypMknMeTOCCpsMUlu_eHNuV4OG z6#DbJ_p_U!TxF#0Qvl!Rl}=baZqHUKW24GHLAlrxj`jzmv@HK->_#WOwil9M*OoS9 z9krYOHt4KH_|N{>IjPC$H2&Fy_v+?ZnhyWYIh%q(1w_S4#|}N_yd^4Fw#@1~u#Gq0 zg@Is+J!@=i$V#&0n1yhacJ9565D6=L(E<{U`}uMD@r#XTf6M=6|3{7f_xJi{EA-f$ zz%BT{m;QI8o`vhGRbIPq^B424+`YDbC;o4IIF|9rciT=e&<(!hVWM0FqQiALa_p1N?g7HE!6d&hSIOd z&r9b|xo_;fVb-%20qBHdPfiF)f^=f1n>973w~#&2y0MLw*rtJgT4 zp4NBza{IXH;S%7hx5O48xR(MuHbkcRWqoyc@UQ3baNew0IX`hYIrjSccj~dN<`LoF z$m-j}Lil9J$e!9mufsXy;bUYc@7+4*#t=AF_}?Q;f!Ibr?ii--TM4g8hXr~I<{ zLsFRjsP7{n-tKmC<7z^=Qpm2~;OWnu(Z72BS)Kb~cHupw8~RByHO`sW>~Ttx;L=aU zpudUY108>$=j0|!B;E;|P(tO#ne0FN=HLH)v7v8UX-A8%{`HukS2*StEEyuUlYjmy zTE5U5sd%&bZR|neznJ{BCanGL=5o=WPUh3wx1TokJyu_u9WSF@Jon(vx0e#9%%F3>Cr+6#8%7&* zj$e{iZyl5Uq^f;h#@kYq-BMz(P}wZz}c| zaI*H%&%><8R*xQ!Sjz`J@O<;AtGd735&g=gr_KDSGdRB_^0d|H*~%otT)~eAT|0iy zN{W{%;~u&jIy$bP-fHBWYJPPQUR~et$@b{Zt8{H@fl-P7DZ_$?3o^QO7e41ow4@Zw zK6c&uBq=C5thhP@tk58xyzKUdblEN@MCARI<4em`$%lssB!IhA8Mh-5L5ULqkoL)e>V8SSGd zIv|2-$+ia`wNXQlTua_cRq9O7H;X)zTp8Rlt4e;J@mR_!QMcjo5ff{@?+;AZ=eB(x ztHss!oj?p+%r06q5V&Y)aAIV^6VvmMeY9P=a{u02w@z z)w2>kLgda`BHyA*jwvAOtE2tr>b+=U}$4mC&Stw)oJ2yS$)kk+^aOTNUJUj ztxp`XOCAEKcDaf}BaUW_pC*2Jga|(IzPCt+m|KXbi4duQFK)v#U3NaZ3hMitoHXsd z@lZS=RFJgU9*Noyw;mcPzQNcz?A9U`i>eK7R#C|s(=I3GyjK@7A1m9lO5z5BVscd_ zsr-GJ_Bhdn#+w3JmW5`KCntH{ZcQPcD>@!JRr_86T+W=n7a+wc1dhX;N3>3B*ZW>P zt81u73&Rg~t(Zh61Bw(INRD3^tsAQ08ZY0sg!{kxo;I5GkyHtrS0=j4Fs#yFfTX)u z7sX#3b0+iOcZDPtE4&CYN+0YJ@ldZUmkn$&S9TB(^0%F-;-;tG>V2E`dA?zz1vS)d z_gVh=C6BRAh5-k}!sYL*?oXSlYx(e3^)NnB z!VYUl4Us1XnlXpkg{u?fF3%_BBJrtEpASG{<@n=#_s{TkMabnPiQE}$)d|$ zQ+Ixk936daSZ(RD6}E7Ntj!dOZl1Z(I@_8zsBeCTUYGgE#3?yP|JqbU z$cKGidz8qOO`dNR(xYjtq$%-0npTx-GiN8NE6{QTxiMn>1OT(hgq0_kv1<#sCVB5+ zjfc@j%YMbJCr}eqQ=FnBHfu*XVcZsms5mV9+)z9~eMCSKs_q*F{o&}E&(Lk(ogzz~x9%}x@@||xb zLGSEcbph^5>7S(-^@+>8JQsj#BDAWDBz`-U2pwJiqWj#Dg*DaUm#qj#2OqmyBM7BH z^lO-L^WkjuFT#znqtMr2(H};t?d`RXq8m=rOHS!sikR&8NgvuJcf@AXC${=Cac2z4 zaMeioK$!FVH-(OiwkdDCSBP=86@`|_9nKY=xXPXH_=t;=V(u+2P)D$A9X7SNPXx!H z-&)>N_jc8n45H`R@6V%I`|F91Uj)Xx#t$-|iwG4+iH~cF$3|~u4&q9oZMhbXzD8Sb zF2(4tWL8d#>=Y`O6lL9V-wqGvzfVm}T~tnq_c{!Cf~Y8yy+ZoOkYvjyaPA_KEzG!aY-){Iqu` z5~m}5Zari6wBPehKKf;TBxs8f=e(ZOkQMLt$;p;soF;9(#Lptx7cVjyW6535wUX?L z4w-VFn3Kws^;HrQ3fjeVE*YOFh%t9$sRSh4Q4@BAf!H=Jd#DN~Dj5Zs|dLHwIDE=_< zjD_0$ZWbchHgefG@)l^VI8P4uMi5L8N`8GOVAH}vchz13tB|&JtV1!wMo5bhQTw?B zZgX*>VIaKqtL<6uuvZtGYpk+t`P$w%Y_0JrC(K0G*(q1DLr-RPy(@BzR_7JC(==hj zpHutztzfm>VNi`&!!5zn=N-ZY(r*OF-cwRs+0VzZWxx8l`tyWZI<4vsbt+d>##(=5rEQeqt`L)VOgZ;@-ej=%9+j=lF$7@nN1y zmWg>pAGR8^n(kMAbnT;`KpfuxuNzL>~RslFy;*|@74um->@<(uVXZXN#~6E14C1N z8CjFjHpf-rEXGV3^S-N>Him!tFg{|^K^>Q5DO@yJ$R?0&3oLH0iAsx_8!NIgOE& z*643=<8VN@nk;GE(-ME7so9175bT}TZ;$pQsd!OVxT~KyLsW!GZdPKtL7{3xUi9Pw zLfE>^1+Q-NT;uuA9)@h+qsM}Oro{v>r{FQ_kv4~$nwl3ukF;-;xhBBxJP%c7+{O4= z%MB~tltw$ezX`W)4?2?`s;`bd8Q^ENDB>4^!Hupq2fi*IIPkEwv*JE%E@0vvjcnOn z=<41C7C*{v)OjgUGfh{V0Q6#o%Xn(OmT)}mg& zic#~8SLov82LfP4(?(wf^>pFPzn*dYYW@99+9d4rg={3OfFyfKwgTWU@(O7O zt8y0kz;fI{+*}=DL=9EkJq6zqunAf^TlM}{S==kXWdr$F%c|Ee-@TFH{Ys=5dimDH zo%z1+PaSWMLE~9g`V|5O$L}`&{uYT;KXrBZrbPN3snG_#fKP!IU&M}nbXRP*{=T_2 z8<+U*_mR9OreL|~QFU9cXp%dhR2?&9X0t5mV_lV!0^p(opD&nomcdN8p^(O>QDzTQ zsvrcz*{qV2T>E7Wn6Fc6m54A~1S}|&s9a-;W zF0q0CP)*chkN-{^cznZ&zo~@-oJ(WfSq%n21y2ronptJafD%z?1R;`tW7Jpoq!~ZA46a zL~|uE1x1grA7O#oYItPC?P!858Yw+cPrB@wYos!>Y#qs4s9X!#6oeWdVUCR*`^9Iq z7%maC-AKZdtjFhIfC9*_etF^-v2i@zaIUYhYhL+dojkG-j1oqPaqj&oFhg|b#^DX2 zyE`d-H}vo;tPW+(dwqO0HwvHD)N@-Q;$f^JcPHU5+rv{(s2o46*6|5*nP9r`DLdg6 ziKsILfO^Atk+U`TE)|D#r7Fpeo&I8aZ(nY-sG-q)YUEYWi5dI;QsQvG+w`lby3aqK z_n+NzRP7_}C(6`}!lYps(Q7$-n1jHNLv$HX5CW@L+c(`VL?Zlr9!Ylnr5w|`9?%0Fo^3jY_mtQox*{2p! zt$iM{kjVvygyAQef)d^dfReEe^tzdKWZp&>Ql8%pRXKDU_3@hcMda$xz0Ga^pjdcz z|F`mlGyW{CUHc-^g=WY9elP{A`-ZCP1tk{z-=b?Pj!0hUl-3iHml%N4SlSt4W`~jp zF!)7>||{K+~P2Y$!1C33ewx9As70y_Ps{3Dn{v&WelcFuw30N;4ka z{OSzq)Z?MSycKAls?P?6l&JfBrT#TKcA}IaXLU$GAOQ2QCzJ7J)=_PIvnbpg!~x&I@VBo*X$S_%s=euT=Sl2s#)ZM@-R_1ZJH)PDApXH(ba_ssk9GjdXbJb!fz zeFIsA$cWCjU?%6idn}b+eZ-{4S#W_x|M!0PW-CjxW=PQj@d&}8D)i0309UG#0B)bx z-fh1gkAh>Ce)9@s{6y^f?RMEZ#|v}=aB^<0Omu=XyIJaZo_A@DOoDm`>~?{m78v(U=&ALk4TD@D6S_LdEk+`0pq(+!^lTiGKwmgR*P1&|jH-P1Fc z5(M~kBP;RFgaz)`*BQqi}NRi#h%=D8X`d$4}uG4HSS!JiWfZTS@csd&J4HPjdVAOLy-?Y=XA)IVdt*2i(guW}bJJBC@VAykLZF5J^k zPrdpCkIs*(mpJpqREm`~tO1M`lm0Mgp4P)P85i|FA9nH=cLpAyynPz}!x*#u$gS}8 zjXV34uz-YfNXtBt<}m3uht~N*MMYj&3>VxSJ=w3R3Rx>iw1R1vyA&4Du{ry)4@|hK z=Y5>DmP=rDrJ=tgJiHq3--i`b<8Vu$#1p;KP`7e zyK)89Fs1&<`ng__K}Y1vAYx*9xW3VjB!0ah z`?1%FdM*OG7q&*ddSlhRw9=g6AzHu9h5Q77Hyf;sWUf}cKnaE!7OXgjD!xRN4E(*6 z)gd`2<}Y^n$^g-(1=eSam+6yvgpiz>rBGat^F&-faEh0)v3=m~;O-2;AI=hYad)tF z7l(EcA4tNStzho%?#}wI|GV!ZyZJ52&Qb^Q!E)gjce8Rvl3>liL~+=2gIOGkhu;mF zBa(U8*;PvX|CR{h|HA(l=sSxG^EpdN60L{_c7fVNDG7_or`HV_pzQ><_)&Ti8vqx; zguc8}rril7+b7-}q$nn==#P0?@c}veQy3j^9fS{iM8mT1_0O0!TUDk=^`vV>d4=(d zJBmMlJ-fa4>?dx&(;o$OOXJ7=)s3cC5SM~ypr{H>O+-0>MZtu6O;F6jDacT_4}o>n zVNBz)1urT@(+iJ4CIP}^)6IPONE3}Nu4VmRb6L4jMUxNwAYfN3&FZjOfSU)SQpja7 z;hr+q$a+E8Z-Pqoa`u6tVH64#p~0Xd=`BNtrAUa|y|r%c4!Pf%v^nEhfieO1 zBu=W)sNPr8^Ff%)TsojKoE>HE$FnXxgoXrDSZ)G&>~FroKqibiiQwydZEM za3*G=g%w^aWFKBxHBYXZtKdwn>GM;9ITK4KLvcy4MuDu_I!uwarvox19ZsfT;FDg6 zP+QwZ9)6fkjYQJoB57`d5^BrkE{^g82$dLEcq;XHLh>gq68Mq~kVb;i{bWh9zJ3f| zS!LNXvQjBH326ywk{e6Voo~_IixPaimfuH9lZ+&SlL47Z8=Zl~fMyx}qI(_2Kh7xI zO$hj!3tiv8K6^%&cE(RyNpHoji?I#@%35^G5@}rYx%CEIp|NeC%whV!X9E@&d*=zh zsws~J)F*&k3FuL1B|lGfKL&P_nGVkBz?bFa6Y6+NQLPhmrSK`LW$KhkD#5K~(}$wn zoC6neyr-?sp35h2r>JC%+Wk5o;Q&6o<&xk@IpcnIFaieA=0g5 zmXEh}5KXla=a%CgTXKRiMGzI+M!t%44h;jCkA;Bv# zMqJEP5l_XeKntuY5w|%FOlp{*3bZDk( z=ZK26-CQN*Uf^5nJ+||q3s+(d;oX!)dD2N3>zjEJOn^NFO%*k}^f;*Ii}E4_oXZR2 znNoc32DGh~v?Wpe6-bmVA5??o6bvpDg~=4=PU1pIIs6b6NA^@YzsnRe9qV;zRNfC> zQSAmNglbwRJ1$gI3PDh1*<@Ev)K-*0vYQ8+N@<0-+Lb$CAy_WNBV8c4|-<^s(z}=cQVt;;VV$lsIpaI(ydmImsPmxrLy>lC?FxlifnC)Y+}v;3$;}2-=my zHSVhRXf~b^PCsFXWf%75bijj!$doAoTC2S83Qw#=?Z>Tgzw&!86aU?veE~fIR+)Z* z&H>tTF&NQ&FGv$M_+$uAMN}okg`bLW!L;PmdWkPlLoH_&@M5Z5#TeMt(?L`*V0<_C zT?hm_(F+G)_^t4yso7uz))ki{kZ*_ckLs9w!^L4Bf^W8eeg#Z4KLtxOg3V_uF-6B6 z)mn+%QBttx)FvMeZpE#lYhsMbipWBZ>c%nLT?U2wieF6rbO95{k{{xKg_hu@TIROe z5I7jRb+T<`6egD&<>FdS+VnCyz@3~e1O!v;tH~9?6G=b@W=+HTwa+dIXkCoJIIT_$>9~N2E8g;(@H6y+|2erj>05Na} zR7F${gu+kRoa8uArz;PR`WTPnCWzaf;%;lAg^pXg6#LhN(59>MmOKW-1MpC)Lt~fZ z@8&>;Bj;2d(ZQXf1_?Hj=RGN!P9;N}Nt>3L6YxqCq#c*Ifwx{FQ4iS?I1^PhCc>9r z;kU&VR|QfL>goKNmdU;u5vZ&h+_vHY{8BbU=6JO=4NFXh4ce+eUvK$Z%wT z@bcReehYy|F*7HCUeO1jf1q;K)!SMjH+ft8)4|kjhr^w+($rd4+sARH_ddsE*ptYCgvQ;HP}sbR$390nmo@r+i8Lx+|$14R&3w6r~+d8@LY@)8Q(8 zOZVERCtcU|lKpNhRCVbV-6k0i79ret$+Y=TauTO0qT(k9`tf;j@A z2(>tyL7ijPPPtGm+`iFfMxrge2yT;HOcDgf9}EHU)jB2fi0_bhq#uyEmiMTdO9C|* zCUgD}RLDa`x@9t?+(gBCvBe`W{YD7&AR$$>Qd>3An5`(C%qX}|Fn%uI0U6BCLGz{~ z>0Ht|}sx zQj(?a-t{AavZ8esX|uu=Q`({}n-g&8B-tYslO#ZI#V~L9O_p1oL(TSQ0pGM5(Q` zTH$V6gKcR)u{>{fi*zHvLVz4frlg4$0GVVpizVPI;0Rtg(L5nm1iS$><(tIv9wc?} zE>=Qv1usst;Z@~{&6H;E5HZM2bfpb02aVOrzc{4-WDMwfInFt~zae-x}Q zi13ZPF~j?_l&|YUF3)POObu_YM1 zqA6~dV*-hN0ZpN^-~=8JN+Ktg#t}lmYI`?Pz|O}>It?vUpH}*WGmaASfb8DGy@fll z-HAq7=d68g0_2EB`(j*jLhn?`AQhPOZV<1&Ae4NUk_njE3bsyUMHv*yetO?|fvzNh zroeKNQ+U}_h}I@>MH#r{W~g!xvVrtMUYRwsPHqpuwAUcpcq|+c!s%8{65ggoGWO5ge zO6i45+RTdam)BM(^Xv#U3b6HMlT+sLWr7~A$)0rxmpjRJl~Yq7o(_=$#XI#uwqa9K zVd0v#xC>ZiZ8WshhLXc2MQpNCkBgL}24nNsD+r*dWQ}MY!l*2(=CIldj^+#kyQoU~ zNIt7Beg@Q620xwpEuFVe=X}_cv!o0=ge&5Kgvtvrk;aQQZtlwAG&n`bY67FCS>bg7 z$)sVxCDI!6sz2(x4$(3hU73!kk8CrI-VpYr*TfpgO@PL!whVTBBs&J8`W>%vBRd}C zi&B&&pbHDepm^ys(I#wnbd+G7j3s50kDTa4vJm5nq4JVzz0i*9{mX==M1G0EeH8*J z8b0AMAEWFefDqA2oV84F;ZUNHRWt(Yt2m3q?^+{T;iF9Fu6<3@WyP?nUG7E%Q(f3o zCv|8O;Jr9c*THzs>2w?cAS&>3ELDrft0Oz#-*2ohFZ(jtGUY8?Q%RMJZw;qc@_B*6 zz>j=CM@i`6oRx9EvdnRc6)ySh6+9~z3~P`8s(BVO73-;(`uwbR5-0Z z=J;KE0^8As;*nSHZd)@ybwQMqtbq)z;cZdHPjpGxg9vH5Dm9Jj^eHM|DSwKDOie7Z zH~2Kdm+`@%v}@UenZ@43YCOqZLkvVb5wjJSWUp5{w<_3(Z$r(q6X$I>j_Z4(wFlJW zQa8K~EztsZi7pQF0?$K0{sXLdV71S-^OUI>U=wNL1?(Yc4|nwQNfJ6YvougI^Nv4i zhv=jqup!=LFNv0x@EVg#(n2;hn%LTDyrsFEXo5^#UaI3A5UGk#YXZfh9UDEcqHNU_ zEf7W166AtWZ%N{%PZ16q^46^5AHG%cNT6_vJ7HH$-sLBLU>6|3Z0;i99S>5zrS_B;_svr#P2B~dN<10-N`gGhjkXNft zwkBbF6etC4RE8zMW&V3P^B4`-ItP~z6} zi$fd?^3gf=mL%Am4yrK$M?nJ#SsBijRrD=2M+trxmjWzhumrgc!8Al6Ks=7NiHsZ_ z9?`Pg?IWToYB!O!Gsm67In(7~TT@k8rRvPg3IuYCjH7~5CweCQoGy!mB}AhwhAe%m zL%vT{N2q}j2m$c53RfOQH6h@m;ZnfjDweSlVGtb+hoG$QfN;CV#RB#-p%r=tQUr9# zX=oIJn-p*Pgbc6K(t>k@tgxa@r^4!AE@SH~^GXFuJ(BTU?xYhnipwws%*fKP;8QqX ztOz2?ua6XbCz0F7H}k{?co$izM{L5b!@+_AppYLcC|;GHc&^=T1s$!4wTJrp`mIuT zpFMIqFRd(eF6F7Fva_3%>OmhmMYGzP(Re`dqEdr_`u82_WU5=EJEkIRt}bVBZq^D$ z)r6+`qpH%?!N#QeM%e+;NU&C~}N&4>+1pNg@Qx171}{Yvm(REBI&?Rk@}*nG^2X!PYHB zJd(_LjifQN!7`PU6_EnJ(dUp~XU~+#z}u3VP00 zDdU}?e(d!QHznwgoRla)U6cUh5bk}Lx|Y9Nf3w*c%)v*Wf+8~IA_Qkx(VEglhj1B6 zdhLqjQs|w!q%{kl0U2pG)ON7H*?jPX0`R>6FaP!+Tb-$@N6OM@<_Um;RCsK4Q}mFL zz`IbGyx*l!Op6*ks^n{E^)-0KINqIeI_Dod5KMtW(M9h_ipJH0npQE2ehs`U}X zTUr2x?+`dt|5Ipkk)}viLNLV?9Ok*!If3<7ToA2pduO@B`A~|XoHX}yHU)H(i4gTt z>O?3`yaA^C*))>RI3z5?8HF>kP6rne*YZ`eBG{{=T}V+kXIx~| z=3LH_u*BBatqA%I1Vl`!M6XpuiaMaUCcNIX^&-LrePDt)4RGZ?$C~lZHNP&asQDas z`MKp}#7qRCFTqwab5i|5x?ijDbIt*oc4?u!C&OpM!<&SHD<%(~VA0gMn#zia1HHoG zB-Q~El28*o?EqI+h5#zKQFAR)c#?D3!d%V)43T+rreuo)Ly8(@Z%AX(QDqB514K2NK+IZ&qWIXW`l)1GAAbFeM6n(*(LO;$rVPf?0m$Xufiman4Y*udgGwW66`Z#n~~hEz$B^L^<9TM^WHw;}a@jV^dEl@0&5C zW{#`WKx5gl$sDAjt2<_97Vk=&9O51*7N^vfHMBbVmA9}l@_X4GCE~m>NQ2!}I6Mro zw@2BBE$I{-{3wLK7Ju2sI!>6`&2w=V0?4=zl`$sZA|&^FjRJE3B6+($ur|EyF52k2hr>Vzti(zPX$v=(O|fgC}|VQkzw;Hv}!e zOt{onhlh}v}s z^DLGwssmKtcTWBh49Br~$>KOqX;IH!mS1O5uYdyX7ZAUY%m6u;rQzOiHb2|&==FfB zX}cQAd34>HmN1&0n!Bd(?d$(pcm`BMSsMQ`9P7J2(vI(ItoR~r275Cui27v}o0xK4 z^+MHtPr@_eW=tfWGKCAr?tl4ODa$`<(L(MM%CNnA_6m5FJC#$hB}jG*jN|=b;ToXl z&&5kQ9OJV%1X#5ALX05!rDQz+rSvSftG7p3VtFSnG2o8+H(T#$sv%#g?qJz|1VG{4 zsSg;37896X74)yjstiNLXqZ>yrBBGx)pOGQYD9zL|1K1bzY10V&&#RZN$>hJbmLIA z(zWR5Jh}7k$4EVKvQ~r5P)3&COKM!6&L0A8<#PB)g}-t>FZbtbjRg^`!j6JMe}Dac z-08>1YJ#u72JyF9>7E}%L_FP`U4Qc2A;~>u<=6JFDw7pUwQ0bws`Tv=xYJs`Yw3IY zv5m|zuObJXJNbB({>C`@RN>{4&6{mn=6d&KlD+#Q!$GcjT2cdc2=(4K5lto57AJGh zl0r0}*O!@&&?oykOma;wEC{+o$MKqb2@Vbo7E(71UDZ)9cO4$K)c2gwbr+1kbUlLa zEMffKch~*YtD#?C40H_Cu$cxw%|(UwjbsTg7-a_|)e>9{35qFh6#&OH80FWo!rT^$=rPY^7=mmRIm~D%H8N-)vgEfLs-kyhc9byQ;5J zbeMGN`)f&Hy&X-zhB%R8%efL@8dNMPme36s6o2k-#n&E?i#!j|Q!a@S(2@{5n>iQ? zFL+=j+VpKS%bryjVm$<5Z`!LK8sZ5+af$VUNpd!f7l8{+5ow=>$`gA0@3a_K@X(6e z9U;&OX3JZ=yXcr1!~L-djTJu8RavHbLvc|+kd|!?!@TL1=g|qg{|7OWC*RNI8gVSt zVmQaa&7vhy6EHtm1Ra! zS95Y7y{7yXs=N=iOz)aiaL=zhgU^I48Y@E!XzB_%XE(P+_i<8y_n5XBI8=0f`Cy{( zUVn?Hfu?9gOrYwb{YWM+Lr-#}C??WT8LF3jdFj3aA*`)x)6_8G=LPYfPz?)aa~tid zFWPN2tzDVC-Pwm zVNc#D57r|W7E7#D6?}WgWF#z4oI3>6p?yfCTR5uJ)fJh-?nYRMzpd;wf+YB(y7*1~ zMLEDOZ-ViIj8iuKO@1SC6)fX{hed&T;0uyv`lUgZaj!3rYue*lC)d%t!IHXv5lZBtu8MJ;i)Ool=? zx5)3fc-T9v4)splFNrmagfpc<_44_cIOmrHlGy1GcvDD+74?X`<8~*sscvRE^#N(4 zDTz=rY(ZsanVHHn;inT0Y~d(g^Gqoz^eZWjg6sOB;oNs0ZHagGJHU3aus~U^Tfl1z z6}eFHwoHs-gr=Q1g($KIESV(E;lw8342+f@+J_)0igl9&%8NW7f4IXC^p1?Ym@XF)O-*lFZA@ zo(LwjEK8DyLL8QX;x5tc$(?}0JW^R?+{`UIFmX18YJ%8>CH5@Asvhv>2w;SY@Icv* z4^wCZ$tSm1D7HsS+#a#X1YG?i?L$!0tUhkZgh?B4Q$pgola{bmoNr8IYMx%o}cH zLvgq!x}0#a&x#O=KY+>nJL~%_cqT@$gD3sm13&W7lq=vFE+lDVL^({rk3;_8cD?t& zHs$t9E5Y4C{fAg%`k(qsT1g1ihkkFvfgLy_(IOFGKc5@GL-^oq-r1B0(CzY?AN)#; z$@*c7b`B;E*MrdGxEVF%e3l18q29y%Wnk~UZ$YE^6D$3*7IWhR2ici+C4fXa{yB!SPFML|7)J#PPEh{@SBcWmv#bJjt|Z}%MmyuKO_^~e3*>he?Z z?_<0V!!94Qz-Iyf=-|(v*(#-n^?(onf(ZV5z_<&bgJmw)WGDmF8mwqM2M4?a@FDjM zJw(B{VdcVZXF(8O+k*w~K@Q9*?LCo6|7p-3d4PdD)YT}T;75Z0kTWEw@q}=An5HBs zATlyV82leP2N{S+dZ*1XwXJMSxDpV6NJ0#F2a%r7dH4^5213H^ng+LOr!2 z7&F{`q(=;RGKB;|#mQO&XoWUoCX1{BeZ?Rc-y2}P+9*@;lA#WI3L_sQMu=9wzJn{* zzz{(f$R>;C5(KzsOoY$@4f`J-*ZEJ$Y>%cMoi!%~{1&7R&QRY98$n;w*ff@ zV}_e|qMA#I2f(|8@P&ebflX8m*=>P~^$u$8e0LV^`11Mxl}pMaV=L^$y<{(Cnd zZUrJiNRDBN$Di@g{9owlvoQxeA>I0Mz$9XM4nTIm3paQ}r?9wu7YaxKEbh2qS-9o| z6eaMPcsg*tc^IyB#chlLoPhs{pm7Hzkr2(5?iXaAyKVaKz7jJBVB}#ZS1^Tzm2P}P zn_VZr(~}56)?y-AUYGggZ{i^NFUOPfq#2!v&yAViXd2b&=J zVoCxB68F*MIngf*66`vnV$qblse(ui2^%OL{v|cMvRD>;(iQlH{QcBu6BFRd(oN=Z zO27}A!-B2i3<#iwqN9gQJLP$&MT5yfr*sVY%XMHF7L*$ju1gGsVX(!RP&=6c2pavn z4mGs;E{hio?m31d0f50hs(WI_2YH^1%uNTf8`)Aca-U%$?7YBbPq$hgd1CH)dF_`#8E*A zvPlNWMDTZqi^516%m|Q)3`e`JiQwnH(l^SgLK~Ii5V2@WUa$#r7owhOuxLXl_W@3# z#T`}D77EUTA)?4b08l0M4)Zty5OrLV#>GOAi0j9nZ$?^tHGHcpQ0DZ~>CcN^!WKbf zQEat#1jX^2x|wCq$gr}@#q67ds<;8PY0Q3eY zZ;XIYfxhx%;e&wn0`x*5+6VciAdl<={s3g;lEyf5o&&JFLFR)>AYuCsF9@v%p7Z6N@R6-xK_6O|!ghA|fLl8q@`Sy10^LQkhKc(nV>yM7cBxhE?P2Sk&2I2EKr9{&a?jCUT5Kd&3 z2?;;mr26_Y9XL1;X*O`EsoU+Jf}iJ~598o^W{!hU)G4^3A#ZSgRexe5g&5+& zK~@UkKrtl-77l-QYiq({-44v_-r)sz1F;Ub4$ z)67=^#Z)2(eb#MNRUt_v5|k*ujHopov=)QB#oFRlBY@(dK*T*Ei|ozEj5N9f^*Lat zKAt$b?8-ujvet6Cs^9(fMoBf7w+#~y6e<>ZLzl%~1AsI^v0|Py53NR+VCI0hgRQ2F z{~uV}ZS>F=1Z(p)vfiQlptluy*hw3U8I(1P$37N0c54~>xx#N>nTJpo;6N8d__sZu zwkBYwx4Cc1{U{^;I#54UI=;9j8W~fjjs0TjEVT>=iz|?H53jn-^^oQ?7Pw%hlspB| z`S3e8mesvxP=q8G(|^txzs4R7m%c>vu>$UVvYyCZnRf8IYtNTX7#FEQXoOtCb#Wur zOQxXhn1bqF-eFJpq7yops?G-_#iztGr%CYi(v#ARG>vLe7>Sv=rFX8K=UlvT*81qt z%gpGh%^3>)sWlD*JSn zHPf9u$70frh^0*yQ~8@H*2jv|FD2}Aw-~{PDF4)=Ni=|TXhpM7ZlKJNL8ci98+?H= zL&ZLvC6aC60NFSe7>GoGvedGe9^Ku*ghH0fIx4}Ujb<1Yaz+d=>P9gH@6PB5lU7Yn#M4*9Ai{N@H+tCW0=|*a*#) z3p9d}b`B3CEIuxAffitr(_2wN2xKM#*`b`%u{7-?wM@lhFGfnHwXtoMQ%R=L6y0(V zK$`*!WMu>?7F7ywCWQnDs3rO$8@+TTm&}fFse%Qj4@4mh9fPNm$ZjqO8}f2p#SVpr zNgOaNhyZXyhx{kLx-?5uHR-@e5aHydXpA&c!Ul*s8fY?jH^v-c(1wKn*!|0~aAdb1 zOjR}YKyZg*xKL0VW4;_H<8K;zPK)cmR7<*xnUa!94H+M{iG)xcL#ktkg}R&m>_hRh?=wR(VRJ)!8cT)?zmJ!FjV+cu!R)u z9l-&b!2He=5Eefs0xUn_4Q^l-WlLP8%nn&5L|wiOZJj9|3Dr8I(?x=3yXSfSjO*N*GbiY;vFG$Wu6N^qXL$?$|cNWlT%mE@Z*i=I(T z1I8YtJc5okh~TT;>vV&aIAeh(4LPwu>?|775`vwRI|E}Bpk@J4HX)m=MA|+iVx4Ub z?9oApV>vvGXnD5|#6ai}oK8E!0#xYK(5^_7@?_ZK2CS4o6y$<51R)^6zd2ZPTHQ%u z&E;?H8}OsR({BFG3TFGW@3rOJ1#bT2Vluvbd#`IVlj`j8tp~}_4uFt&$&WelzC*F= zcVo|Yg&&hG3UYUX)PX`LXJJ>m8 z5Z8AfL9Psi9TWu#{|d6Gw6lV^4d3))Fe+yL#Lt1|2H12xW(W)0a3{Ctt(;dTENQY(6A1Xg5rbjVG*un|x0l^759h+Orna0*kp&@z6bO0}0Tb_F0gte=9`lT4{*~Kv#6w!H+ZIU+u~x4DDO-?8MSdyd|CSr^ zGHmcU`(*6kKVDGW=M@8bk5Sx!K}7;WK!?k=EXC&#>VDE!-1@TT_32JQy$NDhI;{Rw zUGjdSH-cl}vuu6k{f<-a9+KqpPr~fY*imLYALp+|dx%(R5FkPW5(t&DxQCAu^1(xe zPzRr6Hto&j`|^7A@&7lB)d4i)0C}OrBip5As7v`~3Q12>ohQ^wQ4fD3+xIP_R2nN( z8ryHE%b!I_+4l<-wIBjF5j=OEYm;`b?WezrBj$n+5tg%To)o&McVzrTI_d*C|f{;)dE59PY~(fvqPFLxqGo&Gx3aFyO~xO}Wk z{UMzYp^9c5yX_Ym-D1|R1c!B4clf|Z`VT?dnO-86+$;3_!Nw0J(WAph9{!xK ze0aEPt7eWD#omR&vj3Tl#CY;gVLdX9?Y z@RDN>pL*k?M$ZCAxsk~YSH&@uC;@&j2dN64;z;ZipaIX>sBh0D-*bLXDyl*vceSO} zbmkmPlpPI(AI=-yN!%-iqQxKSVk!?~xhJ|h{4UR5xXH)n(037Fd!=cD0+YFSS(Z+) zcnQyjh|Z50{Da=c0}BUeb!Ww@i|fbUcjLda)p{yPQXMBd{ZQBlPTm~3RJK^PTT1jR zpLk59K!-*Sh*$y`JU~Y~+{?H@H-e9KQD4-f$g{#UirQceZhM<@)fnx*_&T+8!sg=$ zIq$Jlp0Nv)#9HEJwYtPHq+uL1R@lYk#Z~l!X69VrK*U2Fh081KDaL6-E<_s_3xmY`7FSUKvwT(Z(%f8rQ9UJ;7%nO_icqOMFpB{85o`nl7zm{Sh-0ue zJfXAGH6#EVy=l=7VrEYHX*sqDtWbz>ATXhX9U%3>NeW;lhw^`=0m^6~Dh5vXa!4qJ zolw~j7o>wyLZRvq>VO9je@6@*!>Un3$p$~L*x}sP%0IxM-}HMgg-x!^hK7qf-Q~ce z97|ax5{m>NMXX_S=iO4r*r1nBb^ZNQ5^u`2sn7bN{E*pJMZ6Bc@#VrAa|>GG5nNpu zh_ph-GGI>Uqs$0->?tQXSP1*X$4!xf0brjLY!K97Yk*ZDtFaepP}1kdpY_Zxje%nP z62yHzrLd_IE^0&b^$o%XpT*7AwY}4PtbizKRWPpMzl;a;hcfth zf#T*-1UT55REkrgu6?q$5MeyyfmxSG?ZCZut-4LL5eQf9K6h0+{$ znW5@uJZOcqQfi$Exh|AC!@!M3Y3OVxt8!mFbN2iE7k_gz%4({?<%Z})I6LC!TVoi6 zDjh2<^zT&=N@ldzVDgI{H7q7EL%lW>mQZ;!U|mI!aFs;Yifv8gNrEPL_*E;w^d@nt z9BkMiu53x2ox^1$gtvf5YtuZj3V&_T!qF? z1VIUnz|x{eblo)cEi4Tb#|Sb(g~^D#WFjTc z61m*u=X>LbNDdH(1c@%pg&>DUe0^C~c_gs~1A;*VwLt-dD{M62f?$xPqF{M%IRAa@ zWRhxep27=&c96*CakFPWj;_Ijs!D=QXF5!TGJw{MoguE=b8bPxL73A`52L|Do;c`{ z#OcU5Y?u(xDb0<8vIhyKBy__NTy46-LJ>h5!=4#Ob`mKsWgwe}jxbbBiOgOE=<&`} z8cPUpif`V#=x-P>=Z@?+-G)3QvDgn(&QUlahV#^@iH3uf%*UI_atajQ^H`WQ6f``c z208SQ&`H8@;z45+lMP8#fUFxQla9mhKzG0u@5x~YJ`3Yz%=h#yLJyj@m>h^i4SQgW zH&pL3!zAIAoG*lg=h%kC%uY*084-#z zRFhScg2}`VDkY7OsDmX7^6X=q3!EW1?1E;(OzSzVduXlu_C1j2h7f5Vvw-mIelNGo6OQ1co?Mwo_AZhQSTa zz<9nxogElhaHJxWY&6s}?4ku9UHN>w!Dn-1%Oal(CtTLN*4LbE&R#1Ix#xzIeHWa2 z2i4rKE6(VUc#gv(`{+2FNS$rBa3`von^dE&?!#10R;FoC9Bcz@DvAr^W z#MYS<)`i9Enxlb=lo%I1xCY4RHm+uR<_$HJXoK*BBO*f#eE%sRVp3wS)@g;t%#tt9x(fK|55x#)$=w+F}Hf^jLKM2rMu-5o&dPqW|fgK|P40l03n_gM51 z!%BV~xn3-Z=LxK!qL39c3xitjKrNka6NeO_I9HexC$n|YQDJLn#<+7kI1p;HR+6JT; zrXhfc7|RuC4`^o-4q0k0d1VqV;^-R$MoBjvwk(JSIq`9HcUM-;VXT-#h@e*#A`%2U zn2Ga6+nc`K^8T;Hu)?H}%)zRh#S`i~BVoU%>98>+<<6ZDl{r#~RFZ24ehsPpx| zFn+DnbfM;jVko22AC)Da)4}-qn0$_oIwa~pw9XCe-1UEqZ!#-`!5v6OFbM>kB^SCn z3ne0E8~$Or`RGr_sC^xH^uux^jPDkNqVFAYzUI9kCBG!A+p>Ix#x!ELb4}YbY>10aO$hU}V#yK+uIBkH4LVM%jJt z4>M6yEq|*1Iys?J_szsR0^6|wLi`5Cztp;`J&-@(LrKC{nv?3 zDZPtRU(zsoTL`98tOcKZo`9{)(XNbbO)9`7e`?m+kx5<|}!e3<8vF*81! zq$kW1QI)AZwt=t^ZHZ~?CAQByQqN@V3hzM9P;U)(vm@rRc95}>ef8icsu?BjZ0HE$%q8;291r-oe6$MI2bLgJN$H94hx+W~>WPM_v zQQIy@IUXE1c~0Szd)vtzH>kp>s_@u>IixVf#5TnsB+V<<1WIp3E%q|0=*Wi?7)bE2 z@ysocwu2|(%;>rHpErfZ$oo!@ z4^IrxKcqCB&9>fyh$U4S-rN{d5Ciar{7wBGHI-jC(-BAOFh2t z$Lhs?XUv(+$GYJHd>9t8u{qb7*74IjMB{}))eF27Og3mC$>R!990Q@xWESB9m_VR{ zv;r8;J`ghueuIW)c&3AEwaBDGzJ3hd5W*1ZhewMnO|FDEiQ+SdbI@+)S||G+Q<0DmJw*dc?1$l;SgA>dF< z4qJwrXVM6@jCM%KhO>dA`5qX+2W3b;55eTa+*AFO_O_R+oYA8uT((#baM9rOWK%#K zkdAyCb`+DgsCE&@mOnq+GZ)CtGOA@t)-iJTQBv;pcX+j$&K@j`T-H-4#uk22sMJ*9 zMnfSC->fvVFc=J^!Ol!{VO58_p%ENAJOhLzH^AKKn1NvhKX`lqU`6-?0H|PvoOpT7R4d!Lx|WcRYY$~AKX^Km8X z(OxZrof1S9+<>5jKq8?vImSG%4+rDFj=Y$Sd2v*C{iL|vOx_8ZnD|3D3>AyEU?PaqzoIK~4INWw5HQ%*Uz;iXhI?m_|FLp<_pGzK$+FID1g-!?0s}kRR6i~vAUZ){3?Tr(LIx)cVZL7(G4I0+ zFheF^MIVc|6v`09!51i0%IPkH%NQx*6aX|0A!a3*Gip&<2nD7HaZ8jS@MjMH zVF8cz&~xX|F~vr7QQA6ZV~ZySorS@r+z5}vc7djPGyIAU=v2_n(nB~xsO^kMjY&dH zZ-q`a{~Rc$tkzucX3V{|{wk)691z^%n@&41jgsqhJN~fdBs1kh5TOY(phL!6oL&z1 zIO-EKnCzMmWajq=pHvdOqXw3Qx&z)HBL_jzfFk(D@=cCIi6INb?P7r%M)SD(CG#B> zBP0(eByu<(V7{%q6>iX=Uk6PQAQ(@=V=|o%B+j7W0TM-nBz$q}e%m1pl3bOG%ts9L zlLq>*q@p~X0!$As3n?8uF_Uev%0%!bvL>^zoLUi}_-;1)r^Zn`<7`74>g+Qx#eJB4 z`CQjv_%p8UbG~w0e+%kgFK#Zn*X-T7pg~Dye7=#BCjR%Il@F+tX6L^`GY6@fI z2S*$_hA|*~NYI|7kH5yG$>$yk@geL_gd0r9r(aZL`^bS)F?^q^y3amub$$AHyjjPR zmiKoDMd!TMx8Ix}!ZV61?=48o3&!I14Ok*wcM&+V4`nH(SeuKED|!w;yXK(A3_bB- z*ggFe9ZsyPh2nuQFi7B(0OAJ_9AIKYMV>&W>k9r76AdAjq#<@$M!lRHyci812L=+? z*#ayAZV4Yq-beQ=xj^B7vSS#7{^4Ua0XLvztPOv|Y)Ad2nwKNrHbR5k3^b--`}sGM zK2)Uep@u`H3ARf+CQ6qo_wQP>fgb(4dN7#vU!brZYX^y}zsdx`=!lPq z8=$dQN1oHYPQ3A}J8^Z;`Thz^DI5@2?uN=>!QY&xkfBCCAKM<$$v``sZMQy+uH@55 zH38cOb^V|~aEbkh*d_o!Tm0Ye_Zs0o$G(qo337u0$7TiK9|Qo|{G;+euub0FV}!?rzL7T@XTSB&Kn)oW z`xp;N+%V150nm{IzC3!>`GzF<*Pn=ZnirH)up|&Y?U;9FzhCOx)KJtAQ-6ckGuFIU zy6xXSaUJNR;OO2TkPytnXao$`?!Dr8ZShKd0i4%Ai@v&gW9mvdN=;l2W20XohHv;H zwg$;FTan>0)=XnDHLV(E&FfrG?t1_qvR*0y?d(x+S-#T@P(cJf?_hW+(bJ(sDheZb z3NYqr0MG+$^@q<{xp zB0R{#)&M)h&~((ApujmSOw5x-3P=gsAIuQg+L3&)D`$!~FuE+FKu-h!p)gW60OcyS zPuL}=NF3N^Kr~FwbWH^&aGe93k7@3ChsMo=Ep$ijhoOg_r1#8`Vjej^nUzzUlCW&- z6foSTqsc`$IueqbSd^&1D#k$0H9n-UcK=<&bzt1+s4h%}q(ztWE@anrfvFNrH`(VeaC~teolb(9xFAnVdk4 z4mX63&D0Kn>O3|%20hpgaDdAN++d*zh6BS&fKU7zb@5r6=xYc(K z*Es;}9>>qp&OkT<2*B9N2?S6GK{w~)uRL+u^jRS-;SSF)!GNU##EKwo6nfXbyY<=U z{QLBalBq)wJVZ;WD7(jLhWkau3JG$?WZ7F-W;&58kzwxz!Ri44P+==2Du>@XfH>|U z`7I8Dt}Xz<0t8ebL~0^(XK^|KJ|5r1abJ)!pQ3hYsem92FZBitoDzr(8Oa4Ch99TL z(e!6T-!G`ij5#aW+oOn7H{p(Xz(}OnddqC-*@@K|bARhmweR`*;X}!mAf8BjU_Wa> zu}xOti}4@Eph9$_G60MQoWbj+6s+bs%QIpH;1KkXIB*llkii6j^1uV6reqLn5dsi^ zNJr=I_d3;n>B^^h*L&8&eNw>251~(^6et%Lx(EZ~u%p@lj0<`_v*vAIICfm`f3L4A<^7s@UMCR+Ju}7xgB4E* zl-HOY+`r{@>SE0BM`MSna$0Lqc5MP$o+1RPI3bcMG#3A$9AgUB1kf4+lM|*vF(7OQ z=T57r;-U#Vl!%<7zyRhdiLjYEhwpaAjh#b8O(j0y0(3M-T~^qtB4IUv_?U6S1B8!A zNTY__4NFZK4h`^YNNhL`0-49^`~H0z|0_9!{2~?0#IMV?JnQd!ZMN9kV{Rwsyc8-T z2M|)=huQ_g;vu|ErlN)oyX<7MN6} zpXS^-Y)ATB{6Y{m>`RMvfdoFS>wmX*d_n7;c-oF3p_yS25#x#mwA+%*;=;!Wi;Am) zI7h^fC1 z9yr;jG9aT*R%$3pV;IEIP9)P16fG?+A)`q^O-NM*2DBb*ZPzj$n=KS(V~OLO@MKef z?IpfL!1DoCJ7jYWLzppEViMh7}sOstl&hoo$lLV$u14C9Z5wxPv2tC0kr05P~0!A`*Q|aha>Fmj{ z;m;>3y6kvAZW_ab(H`Euk)MFGT7`5h3LOsqN5%}YHpl}zvRMhQfrj-6L1@GrDBx&? zDHCJS2n9G3))WV94uwc)XnX~XgkX|eM^NVSX31#m5HfX}_MOt9TsF9eF2@bXO$5=j zR5c`y77<&`jU?)!P69)tt5H`dyjIST1lo=zK9D$F8 zgGWVJeG=Q-bq&-n5S&CfpQZJLM_C4tHfTWMnF2P<$)seCYo(338^Lohz$GZozz(9BN5_HiP6DG2yAdC zrZ^oNAZMh|Xw(awOimJ0$bf_#ixUb?Lt~WHVS$;`agpDMqKaZ1uSP)BkjqDpUzfMP z1e-fW?vff5xicetAaF+r4@PnZIs##|FtLdQL_G({ zG6*(PhO!eQf??0W&_HM`0SrijLs=3m3kgLCK;b1H#S~8DJf~7Jb`v=eaWgsK&ghPE zXc0;@yB29J0znMe6wO&dfQFNrAVvgXALzjB!AArmgbg7f0tY$DB;p(m7C{H@ScCXF zAg%!-OSHZnFChx($G~Ut$C6)&TXtra*W= zhi|0nJwp9L1&dK&wYF*vab03-!tL~iCM)X8cVxaxnHxq`Ay68NVk9PrmI)^Y{mTSN z6e>9sL|Tm^;tcacF{0Km%nD-xvE7v=FMFau0w0cqI7VU>gwuYMz=3T;3kM((yO)BO@@dBIAKz6wM`g4mEYg3*s_G1g*A%43Ls3n?*V!X{*U<7KxP1)f84v zch*+?0=RN#G!7sqh}BR!03f{FF_T0<);uC4QWsNY6vwUT;}(`d%sFG3P3c~g){77I zVRNLgpt6UMhQOL&$kpT&GBj&AZ7595qVPe%^`Yk}u*xCDLZy9VQyvMAjJMeivLNLY zDQy(4IGkRyTlKwO49%)@oZO%xh~TN-X2HsvAp>}tqFg0IS6n)tL^Tpo!(gGt%cOK@ z9WwCh5RD-8M8jxv!#aob>5N${*lgg=0Dh#9uRy$Wo~L+rltPtROp?j!G<;FiWyd_z z%$pNIw!-sSsx`PR2xK7$@i1aem#hSx8R-w`c(!|kB79~EjGAX7XQoNWIN~yg4G8Gm z*<(!#l(3#pWROIuA4Ic~=3AO2q9f4mOc1eX5*Ty?p~<0WQpV9aI9obrOkjbE3xSn4 zt+}LglAt&_;3+DK@v%v1B8(W~CTR%n8L`giE-UMZiDU)Hyq-!|40zqd!n_PBA~2aD z2!cUqz^mrxjb?_pY>`A)65AJq&~Vu(=SGiW6kH;5Q4)YOpdJQ6I52pP)q;KGH?JOo zCTK5nt~Hu*U5`#&#N?Z{2JAHy6}VZmluKcm1W^zdMW%yjLTW-xBuBOD#soaq*Hk<1 zEhLARX}BV+vR-6H6$pW_$VZ|q(>gNz$nB#VN)2VE4i?mX>tB1#aftaqDL2F?^SLH| z@WkTa$vA>h1^8^ETMT3|S@K+iDEYmJ%jr6dc%+h3;vGjE!6%eTN@d<2A<%wo~542*5 zEhsTfD4!oOF7Ofw2#Av&zUA*8^yqDzSKD@7Jr7B5Ty?Fb_MGg-Qn@m?q}PfQ*Hc0WV!DaM%vwdU#Vq)fs5A z%$_H!=`E$wPWc^ILzwXn!?ZcEX4NxwY@p!9G87{^)A9*0z?m@45wO>X$mw_kiOVG1 zL7w$FbX-?Uu(0kuk<=$+x0d1Cy<L6 zV#_l$5EeT)s@mZ#!XgFa30QU@3pf7Q7eTEW+a>s|K3JtkQ0Bv8B%p2q6hudj`e@awN6UT2b z^3=>?^=OE3&^iQzxcKh0*veT+#pU;;oi*k@_@dH_&a3Zy^Fndb683N|XBx+ke98l! zn1G$Zoi4;C=4s?A9+XUz@j%9){&_qP(I9XWkib~E&*Hxh={=nLGq$#xuF%Wg0sJsM zj=Bp2 zQ*7RRjKRqVdJBjgSYZtW2n+eoCuGM3PJC+gScJ{{9F}M`2q0r^pUL~tDAARo8X5yw z>=`hsc9_sUdZ5ldasif1VVR>#H)ZBYx7M*(#xa<89%>Y3>o%ohQd-U*Mlqt*<4;$d z7)r2av#Qn|?o~2-;V_CatqGt6grEtdQ#hU*=1E5y$S53~Szv;qGnyiXF(nNQRgxhD zAOL|xAPHCk6#;++9y>D@As`r_5TFij&lxr8tOX2%5a^c6s?7PSkwWm#Ma_^Kjp1Iz zXamZ$ut=lt1^^dC#vGyn4E{L&fl3C>esuc#c(G2Xr53OGx0RJL`81wvl3lskTcBYHFnn`an}HNaD1E^49>6@9 zZR9~D13U;G0*M`{p}`IP0>VcGa6=Ik!q3SdKc~m*cZLucn~Ps-+$t^@MWX1%!Vltp z9Bj;9UQ)WWca)|EY~RV))YFQBPsJki5z7sbNhU`Ei)CSDni-UK!Oe1}hD%k=Rgn>I zL#KiE(XM?MQjL~TheFqe6BYa-=^ol;X>ZLV#nV_JK5*F1jrXo`iM+LK$T zxw*oI&SNt8s&cd3UB2F@Ad?Fz%NA)x^FA#dNhHKXOa_}LTr~_t9$!8tx+bEdh&Bp% z8;gjHJ#Wr*c;yZfj|7 z4iOSyqhqCwMkQ2+(R9 zEu2GSqf$sljF}pdn`#kdo&l2sWV znI>h#(c&^Du+iq57>P)NbpU`S9n&Cj1aXdW$PsV_2MP)-H=*q{7MpmsOz>wp&U9`~ z`PY1twRovbFiVYfl3b^3wDj!7riDy_!ub$N64=kPK|qb$lFtHjf#^FMCE7KR>_Uzp z=j-+4QF3DIMZ$qb$jE2POt2Ipk8edDxA(8Th-brs=K$Kz2Q-BsXOvSot&bCUJxC)- z@(O*{`uf{jkxwKs;glg{cW4u1IWbXX!ZFfWh{O59c2r`=f!xNmr2KnjD%j`6+fmdA z6IxJNx;2Un5f~$x1Il=E4=2vfP59xHD_15Z{0VG&fqP8Yw@4`o2F7A(qNu8vFGCzH z4+-iShhPx1Xl7vdgrp`Z!TK#jm_dRBJ+Po%VMzESC7hW88VamYR7@!xd6;-)Ib3Xb zAu*1&W7a#eLju`@IKYZ+*97wIFJd5h&$Lfrwrj4ib^Z12)VoU>&#aX-V+0VB&0+mGaL9OB*&|tT!?iq;gN9i9OJ}?EpGPF{gN^ZT0Q@Yn4;PrT20{ZS zPa)tzB*;N7Ne<3t3=UEbX!Rc!YHv~ZAB7l_$m!o^LK|b|WKG)^Xx>5yZ!%*}V;Me! zF8Guumh+4()H~Q9Ih|v;?oT_q!RL@cvn=dEryvU|29FUbwLcTA4{fcx5Yr-U<$Gi` z(boH=jv-@6_8^~n!gplJlTs8W%9sizq8v$*&0#NjXs>j<$WS4f(>cyGzUYIfWw&f( z9*S}{Ctka<9sWcpHhT)n4K|ZQQyvIvk&YA)<7cnzeSbY@Ms=TKzGm0iJ=W7}Q|z$* z=bCJD-26NBj`;_KnSqx*)L=zkpAW6G9jq(~3y60_ArY-(!{9$K9|eHn|K;Z)#`|qB z$Vi@b`!>ee*4RLyDwOz-GEZT?^2BPS*uNvvv|5|#o8Ug4U7%r#d)yOV2C_RQJV9Ic+;J~i z4*mw@&=?u7rbZ~!ICQxaN3G)zv-lmqdn_2_lMlw$faINj=-xqOHEJL2w2|M7b@8d>c z#dkLa4q|_TH(ysU%Xbe-hTW$k&ga3GD~4#Rbg!~KH%+q2&HMUJudKe{txWvy$yoyc z9PuLB4h(;V|x{)}p~jpI9)&0`jBGf_9b zOzg^c)1=ljd`u?lRZB16D`~wQfr=5d9%~{ix8DK(i450NuTL~AnuiQ$h<(4beN&9X z$1rU%PmaizFER2z&@=zLD))b$U3wM}XCoX$D<*S!Fp}X5 zDP(6iEhh>pO>>+%-a6I^qOV5?l^>+U_ zzbyJU*Ki?c(1XN&^c9JU>p-MmVgSwD%i7L&Zb=3X3g!@9;p!j#I-LQ81*Qi~HKs84 z3>rfihsJRXF^A44P{WSH4kvdsXl!YWz9N*M`Jk8ra8U_~@<2PfG^jWGK>T_BtzYr9 z8^(!%B1T@7-|YEb;i&aE1zMF8;>^Iss9g z^}T{^)2)*H&C~l*sJjoXq+wd_l`DJDHJd-~?J(870B8*v-?mAu0O{PpOp^SI=kwS-)X{(caL6wtr=Odl(67>>3#(Mx^+b6DoZ6ISI^F7k4$A{{ z*LfN*^Y3@2n+E9(-L>NpX(0GIt6hVl-J@(`;M#X=bL(c!SWrMmnh25t5-Jr1^}}z5 zw@Y==$Cj)rxN%(nF1P`-QT&7K?8*~|MZRm4*indD`fJH;0}T*R_=R+lnlx*VK|!2H zwhFu-SX50Mt*^~%G`fMxz;YmC9M(bc;ULx17{Shd*DR8=b7#AL$njCTPVCt9y3=FT zkhPpSPe+?~cPQGgIbjN^I8Flny05|Dy4u5^F<;iB`;a=rj8?u11>|L@FG}fPv?@7> z69f*zGEgdzmJ+cra^>u9h(UyhX96sTOV;V8Oa#Qy3_gatin%>r{~dKa zR~73nwx(acwgNd-dsPIq)W|rHpI*h=H;qr5l!T55XA$Yp;y88fZ-C{c)(E`c399@&WYu(UPREX(?Av)brI+fKeCnssXt=VXcj zt-w3o!rl&pNI+B<=nsa`m^9ob_x$zt$D(t!VR#FW^nDi{SSZjO0+5>T(1Skg|6WPW z{6j%AtBb@psttM{r*6BWt)N*feU4K7UlxibW&sc?@Et1hB<|jKCucg#T4(BVQVIY| z2m`D+PKP2QI^GnT`QxHfX&NL(0hO0eVRZO zcIa8SJ{pCpOh$1ISA<^svCC#?qSmx&FxvjT*6GJ%s{gyC&J?zd7q~FOmFf zRoOn!sPD0BSa)>tpFFKMga5PPY91=qku0tbw=QtA(WER8e9%hL7*?ryV#E@s0vP1Q znuSN#oa}t|!n-PM+pEm&{)aQWsT0OsP>}h-Zjn(#=};;o(OMmA^|)m>O8i9W@{{4BP|oLe7%UYnp^i4wxJ4!l0H-cW2ELScsNm91D0%86Uo-J9OlX4 zw*AXpl7 z=yU$71Y9=}?q%nXqdS9nVjH)*(7sshf@ScFF|^$|^d7Lq{R_dkTB~ZF$Ok?BeI8aE zz;Org@Zuj=l-HAgk-qcMD3$Nip@zPhXV1{OxvOp%wK_}LE2}00(awSuue;|?jd7PA zjuy)5GZ7({#6AoJ+<+(`5_hUBC)8SdS8fXrrp&3~GKt zDYKMZA#3ornh~TnmT+w=H$5)h>CT8JnqfO3v?zQiT>&WfS4kuj6O%Pa6YxE+9gtjg zkxF{9?zQj|OR4l{6dINt*1Ja?%<|FiF>)7wa~&!NxI?BeQ7M(3eWjwcOEra)nwz&>KI> zA|7RaU2pZ;&VpVcGpBIj=LvXpG}jxIN?7Aq)rn_ z;pH}&r|uk;kdzO}HV#`uIAni4`+5hC6Bz*s_2{HPOp5j>YR@8k@Hn_l&KpNa>Jb}P zrm!>R>8`oDYO7;~;p4_oc>GP^WD*q=0wt`3mD+$KEq1tv4@{q4YMTDT0e6sM*UePw zzX&_Nw*Xp2ig#*Jh=8*+SmH`r%&pBy-gumw22oXxb&v{cAiY%vf}r5eBKxq5V!0Gr zXGNn!m_Ic{Qw;e=Ud0X;2Fx)XfS_?e93T{S2z%F`nz1z=AoGwu0_6-g8-d`cbWn2f zczb!HYcD!tJ4H`mcWr|@E$#C;{o})Px_s(5A>doVdNb+C-)o`Mj!8U1MdAsVu_jwl z8%YCidc2=09W`$5gZ>>ChC*E}OcLIeFOIyO{aQKlS<&n1o|)ahn}Z5j$2H9G`Q{5u zSI5|Lu#zMgFhV2(5DnY<`8RXn;Wrsg;mcelJKKc1>d{-M)e3FfkuHoY@A6j+EF9J^ zKSBTncG?C+PhIGyvviRXm<|w)dESgF7ga_Jff6h!cCE0f%NWS-0_tV0v-xjvWGzXf z103utWv#~yk_k`%G3nZ}&jtZ1rB3qZ-HN8?iMmo#c&-6&$zW$ZXv96i&R7h!gXLk^ zcq)izf{Niw@417r#68oEZ4Gg2=-p-0kb9tNg=Z#YUX42j6VayxG8^6)lmsCJ3kpO| zn8=aH){X+F03;p6QvF&7rXy{4y>q$p$n?aEreQw7tea_{BgGuD4{3%Rp=AM$0K=skqcOj5TXxznO#8LcQ!> z_7706v_xT+wo7~zKRz$bGGRM1Huv)EbIXOx+(Ky}J7xX(GTvgEK}mJ34Kr_TnXO^8 z7VBWi$R87&rMIer6M414U3%U}Eee@PpH^Yg9Gs);B7ZURe>D=Y1(J1Y#xiX;MUQ7e zO_PcRHR6S(yre|22co>P(GM)&tlwm)yE4A3@ep(1Q01zFIehr?ermofF1PQ#AG5J@B-r#?!rp02)* zZu})otk!wQmtOb)kRcuyY0YARmqLM|ev8pVV?%UD^*-OfxLp%xp%4Qb#=%<@S1A?v ze-eI6$B#S7!fZ^_TCcy1#>7foDO@MAu|IVv>gz|M1Ji9>@)C#$yo~BtMVV@9gS<1l zN<#|{JBZmg9S^=B2yfucOga8nB>Z&V1iJu|C+hLNg&BUYH$d<84rySy#~wVec(+%b z10ehX{OA8*`9P8=kRm8TNNJ*yfT zBqAw-LKz4MqJ?OnN)m)Bg`}Zc2#^W_B%mrJpbDZTgr+Nz_3Ru185jVD1c4<3L_!Dt zuz~+nA^*xiq9J-$86b`W58H(nm`}_QG7qdNPxujE5Hy2AK1tv{Oo#rTEPDhC68ni* zgU}=>1IiKO&V4MIEDqT{<&F_FQPqg%(GvwoOa&1|Ma*-OfO-(nyn!Edx?D4<0w6~+ zD}Z!xUmC8oM-vei?D4$`NNpTu4zLcxSSCRJWaDDu81M%SF%jW8lH-G*#Jo66z=af3 z7dVqJ(Fw`0%b=R3aBnWKb;PuWp#&|VnWW8TI5=Q=L!lu)(&;*V3?Yb9mnV|&Yr$PS z7D_pcLKBN6P#lar)^s?|j##<0OW>5#NN!?+pZ4|61n4Cy#->Adni*U;914>#L=cJW zra4i9jscj4WjsL<*4h(JV4<2!+%3bT3Y-v}5Swu^TdeY8u62|;@s9asBh!Y_sUj;2fS|pGn2!)!B#R|a-gr&oTInZXy6pmpwu15&KC<0Ipqq~86 z_GKfr3=JXNJc5MbG}eM8s-l-mOc`n&yWz=R8>K_J#|SdA1G;qv&WWc~b|(;Dbb7!B zl=hv>JcnIeLprO70Bp3hf<4G(6C_N;@2tH_dc|o<0+1pEh-e^*D2bu~B8f|j)F>uM zPCzq^f!cJKJyjuK_6ZC=7|?J7hWMEyB08v=F>~Zz+!H~7q1olZQ3H_*hkp9Cj$-z6 zI3x~0uc>$$G#tFhdJ}QL9wB*p5}=L9gHsY|vnj@50ln+~6Bs|}XO~7dkh9|MWyGXA z&T*E~M~J17kkm&JO(g;F20~Io7#FaSuI}P`(G-~o1H?K9PAxdS@&}$cE2~wi!5{LS z=L>*<&=)dtkxdfh6tq`q1p|(6g%WI0?LQY*{C4`^9DgkNv-}oMN1(o1@xRMHjQ?e= zV?1lbxI0c@f+{2k9uOeVFUR$iE}Nx9A)d?Z0Plbg@cI0ce0jiMu!bmEm7<0sND;qn zlBJ`{Oz%Suhlc{<87dHf5P=j^#8E>+2r6m-il)V+j=*{NsHT;`5fuN)eL#F5pg{)E zQlUjBK}`L9qPkg+{=rmUrj&o=DvJ~We@q^Tck8E}tv@f}50ZX~XY>c}aP7jA!~R)Y zS|1iFTG;@&;9!bz|_S#0U0(<;Yhx$lPTEwAp$`^=SDK8u!BTA2nUkQk71C& zWi~`RI1l`mz<#ty8h9VN)dabDMeYeu7z>&-AN4m$h<~s=z75q#A*BonX5j%eI0u)N zIZK)p>4+Q-b6~otx(#%QP!b0j1At}}tOx<8G1PFVTt9xHeuYXn&cq8KGw%71(1Z=s zPeDOQL~P(gLb*?Pgd@8U#Q3@l>^a*dZ&T*FRJ_!NtHA)@y$V1$^$CTTM9UyMMNJ5u zphXVbKi5ER^ceWy{R?Og=zar3xrQU$>j*^mNOQTL{cHT)eEUP>fX&e5=Zr}qBqT{W zN~sAX)?vyv-mLAIQTl_9{h}TKi<*20jp^v1^f09SA1HoPvI=OTvS!O9Z3Hlf1pdIJ zD6%OPPbw7ZM9PN@n8{_^(Rsb7e z@Woht%nQJUQFQ*y@a_(bivW2;B>!-D{|WjPQB~o8tV}dGAE4tW^AJo-Tq(^rC)mbi zV@ToV=Q{qhuVKTB6GuwkCI&Xb_3tp519A%pEb#}y^36k+Zkog`0NDJ0DeA0EGcTLw znmv?QFwnAzg!U0P8>?VMIK#poACM1Pk~gOSnqXI_r_6f&sbf&VbOjUvK_6Ts0(K^q z(jCd#Ff^Ga7ZBt4L$(TOQ#5suQ{EB}z6X{0gzA^n0tXEw2r?0X#IQaya-0)zJYeTr z>2N+FgTQdKCnvln1$@W)G;Z1)T2WAxwIAF1&!wc%5sD+E=qW#2I6N?a9EX&o^5--l zW{tm){f7m@p2CCZ2klHj53388NSIPDvlA)o>=Y1+L4c3MKn;Mhg$ij4h2StP4T~aD zsM0k55n@nVh&Te*H~ZcP{oKDVxeg`6e0omm?NUF0BI*ItL*|L84o_zPS8*A-6gx=X zq9rrDcVr<+DW|mZ0s=EbvaZkwL8ST*TZR*KmOzv0tOLvbO(v|Zz`l%9NXf9Z5SeV^ zzTQmr`ARy1KGaN6E?o2Bua=}b9&SCyKn*5I(80EVHPVkV9I=ojRVc#xxcG9{H!@Tg zffry$0_tr5>Q`=x+l)(5qLcgBC@9^hsqN|~e|&s=&yaN~;}0MvT6uvg3JPX~1vL>w zRP>tx;kBHyfC&+*f!Hu%XN)Yg0!3kBfuv3Oc}PeH2WG^{c}id*%yPqo)PdcKIm2QY zf{!C$3!GY#yyE9r1|VFe06#fk)Mj(2b_i`<$P^{HaMUm65AzDh#6&q3DT#ZU03p30 z2(e$1fwIa|A$~>sB|s0%M1TT#A}Ao5s!~d%30MSA+Ye-ih&PYn+$P{$RR4(y2@PRI zBqW3(K3LHsB!=PTSEAmdtW?%$I_U$?qu?;}gdeIS;UX}QiR1t4v9{Q+o}~g@t9c^T zwyuTib<+^=q96Lmvv~qylp(H#BOH}2$*8<_B6ciK`6ciLu zMHEp<2>>jx2p_l-@dXk9KvI9hjUGV^kFx`B?f;LE4N%BX)j)2zel1`mJ|pvz9~fxE zVO12>755?*Kc*Y%SH54%Txn|KC?Hil7jC3K*H*`37gd6w{2`irU=$3Di6F#CT@D>M z9`F$$mwMlE0E9>qj9(xmC=QVAy7sA}MUqc|WKZw!6AMobqeKr)g5`tLAz(H9gCN`u zh~zjMA)|bw${=?`IzOlrU%h4e^H|dc|Gtl2Iuw)fj~Bmh#G$>`kr9WKe zv1G=mstTrnp(AYu3-M!gvcc1|?n(x{mY|5jOP7%>sW8hAPx)U}@DA1kFSvL>+wn-8~f*NJnO!XA!Zh7LqC= zW}>gp=@g+HLWB05U16`9l4Eo`01%1Bp~NBxLMui}AoKxu?Lmb; zuZH@`Mv?-CL-lN=DiTSwa1nV$^KA{H2Y=oXfy9eoA{}PTUzl|Sp$Uo2vjC1i^oc>k zXYL+Q)`%MrRP8c$uA@&=5Zl8N!I2dVK^NGi3ypz!w4e`jp0~b$woZHT#Nu=vsnD3} zs)*@&R0RAl+)XJ|3-Pr5um*^M1Cl5qqq+?u=^i~e52%XJqG1Y9$xz~r8v^PEM*0$V z(59@V)RL1xy`wNtg(-^m^ps;((Po-$j1xj-aO4MGw>BNzh-iVPP{-tqIH1u+gDwKX znoC6914UXiW-6cM?c6~sm(uqW;lKQZ$A})-D`Gw{2!VHxeMM1muw}=2}6Sj@GunMI4%q# zz-sAEh{3=>9L#kluCz;O$R>O|B2SK6WRSBOY;Z1cEME67Qje1acmBv_DisMMoF*!N z9U&pI=4o=m3nrvlCWGOJ?h!v^`akPdIbW4h$44jSZlm$NKz$8#2Pxb_7=R6k5mg>Q z;lQelqN~^V7wZp~i{m@b!DFNt553JKvH65;Yrbe<6X4~g0QrJQ1RzMxAo#4#Kz~VA zJVEU}_@0xv@F9NsBS6lz!605qRg zYHyI(HQ3Rh%Jd#_bw)PbAM2{$*h}k&ll%L8_dAgW_x|p4E*#~%C_ad}fjpxa|^%xX7>$}uPvjm z%dQ0_c+J0HTs#EE9mex^)b^@gAUv?_o#K$k9$8N(5?tifep9Ebp$loY6)ib=P~%4pG8XY-vr|Dq*bNJ35z0hCVF{f2pbB z1L)LceL9dlkOH|cWZ*1FEN)gS0+SWblrpQ8npH`x-fq;GF&xH?n#8yb$9Mp10r2q$ zqJx0vtq7*bs4&mb6|Nglq(@5RB2n9ff$^d@V9P8lTflHHRHxD!4Tzt3@ElAyh?qhe z_xP2>G%qU^<=h1t!I0QEV%aR+d9DIr^6RK*;b!?*!tpWX2sPHw21pTiKxh{UqzVJ< zue0FT@wi`HIWN~^lno(}I^D^b39QFOjj9)%Nzf-U2eJf#ArfBh$Vdfc635{e>u2r$B+%79sBj?yAbY)i1;Ec8?8`4-FwvM6wS!%=vTz+GY#Of1lLkmaj!)OIfP3xappZX|ec`|c(DdH-k2X}H zY3?RmaK3`AB&gL+0ExBxHZJ^io1Z!;5J%1Dfi^bnyu zkWN(eY7ln>6w*0aYT5kAe<;5Nq1@Z>hrX!*jajK|o z&MIB$5GX(~N;3{K6>v}=3YUjrN(afArw=`g6k4RU$exQ`@u9O~X>wf3}u)Msc)I#QtiOao5)5&c>i>pHb>j-Ad5Y_Y-0`8&*)3sXmZbP~U zlq0G@YMs>Ks#|I>FbxKf(Ky|4=(?^s z~F^AHVF~kt=*DKcLMGX_p$zO5Ng+Co1bBN9qN z0uW-(vkU>}Ac3(8eRnP*Z39#+MZrY=|HJ;4eg{5FKiwZk>i%zru7I2TCNI}1rRFis zjm}5HRrdDZ`?>vmKtJ0RQ%uaoL{zOG`M^{pMTiq%s2|LzK={8b4|I?|;`Xr#RYadP zs6V`iG9=kEx2*8=KnEyH1 zuk~1v;YEKU0nE$}3MiAj4g*UFW6%a5m5_mw#VD(zIR4A4*o&<%FiwM~=tG6VaovETu$i14)XdhGlDb=9TWKKhGBz&+m?C-)(5_92t82j70zRJ#^rf}g`n>?|CT zLgIIy>4oeANe;o%t+*j}A+d(jV!Ya|Yg zB7#_mVd2x0Ku^!p`I|FYHo#aMz+@a@lfB2;om63t?f5u+Nnh}fiuI(_mIyuk4p*Qk z{XuIQ0RveR?0Wq2Cojg14dXjwNIf(}@74i88Wa)OCn!*e4kuuCZ;T$26hX;4OtO;c zN^av!hlvT*etpGo4*j>?Qz1uyAl7 zA!Gp`LC_rv(-2IS7MAqbQ0Sl`kSK0>r6^F+r%0&x0u-UgBzzGLTssA_cEk7|7J$TH zVRD3l0KHI;&tv2z?v+rbAL(GclLARMcXx(OFl336pntf#f;r6@nJ%QRJwg|DxHvOw ztu6{K8W_ZG(|Kzp+gUF~!sp6ZkM~Nh`YaIe?AaifKQMv*1WkAdWPwTsk^&H=(%24% zfuC9tKSdfqSO_s$N^D(K87;J;F0w2KT@Il6pukEdfHW;41O8;}4tUPe6-|`Bz_$XA zdV|vs>?5$42DBrMknZb0DcpMumiV*}p|4JYP+hi;PZ#g^yyf7Uh=vmG%b-|Rleju3 zo^iKW;nwlGI$(uj6nm6S*klQ5Aw>7S$or)I2)UE6E{1?Pw6n@!XaqynjT*uMW6wjA z@7+)2#-Li;$zh8M4&(otUjJje;**GSc8`n6VJ!$|vP|lepyOeeB0(l%vlsftf(8~m z!f^hip|DKHbg5Gia~O%Li6WYqPeA?TPl$FO4=3=U*CVSWKX7I*@XXKw%s>wBv{S@{ zpa~>|LvrYm;#Cz=)l^eO1q2k45m5z29Ov-!q)UqbNX9ZKmIl;?M7p4a?Rp*y%j8EFfqA7NW;H&lrAwgM_>;l4a+zq3j>CZGNzJqC^blK4}~^}LM#oy1CW9UFlZnvVG(p4 zIAaCqiU#NTMjWZZ$q=w0QkuR1$Wi}DQepe|Xn0T3W7tEfLiEB&e8|KE2LAK=5Cr4+?oo_7t*HzwlXa`5bx(4ut$n1VBU) z1-L~Jd!Ts*J8?iy2p0q}0xF|md(0`KtLjZ-#2a_9bG*R$-bVP} zRDfEklX#BYxz^u>G(YXP+D6O^K@x|9tl~AI7k+`5u(rw|byI&*N@*wxA^sGU6t!Pp zpr-u@Xh3yov`2tufp-CQCmDvI z{9!Kjr3OiomuWFz(yN6c12$=>qU4_9>^613+NdN4v+J0>C&K(-G5n;IiTw1y!QKb% z3WXF@gpx@Z&VVz%)o;(C4glX>kzhBE6u*KPfQTdRHz+=!{}AF87-lCA%wxtEQz0-O zf{=xP*j%`H%nDi}83_DfcxdtbR6i$^+#caLhtZ(Q!omU(#82)DJjZaW?y!6bVRym& zd$1~|EPv>k(}p4<6H&q)Xt<+{{#|v+C;SFl?lkiokc$=Oln4lG zTWYv}*($;P@DSfW+r$g+`XeXa=)@5b5e~))UO}BI`ABvSq9&>vuL39ZKfoyQdp$eL zPN0yzq&$-Y;4!=TjEkl?F>xvd{#=|bUVx3OMqqJagYoFomHEuY%!fq@DuqnsPwsOJ zHOb4)?TO#_)O&+5gkX1ebSY?P2LBm9zyz2q@B21s7P&*Gq6dr8y-Jcq^Mis88c+xd z5p{uxIfj1B0s{s7MGm7h*oQlZ?wJS&V}R%Zbb^pDG*n1Pg^~r14)j2Sfk$Q{JAY@B zv)Jifz_(yz2XKz@p_>l{lF~v#c1^VY(4k;ZnSHrN|D2zIKyM%&ZgOO>vIZE+KQKBB zCJZc)O;lVVMh=BsrvTjJ1-y^s_x#7x&0^J!h@_H9B+WA%!VFc|EsY2s=m)_N17fCN zCP0N271v_#AlpMvdKnn_WPq6yR2a~}oKs(6~ zY8LYXI4?)wJj(q(Up>2Dp5eCQ1jO!gxKd*>Biwy2Xv($BQ$kqIwhx;`g9v~{#WBJZ z4q2N}_5pzYcW(AXA!@-&6gD72fe1Qck5SZV#sLfX9nunlFRRfqoM|N>k|c=@`R_bI zHjD!fWi*m1!U#BN0-br?THJ@I7CG7kJ3q+t*gYqOjlB$rng~-Lata(!qvIm_Q^|v6 zfI&hDfVH4Fbwv-p9RcO=dKfZY0x!$SEJ4J<-&@xi3QS5)K+oAEA+R|dqZkYg9)u_h zNP-aw@$kO_9#x?xxjr-Od)lHQ=z@2?+Sb=e-(Ot&$sUJK99M%PZw^jQRB#LuA&4(( zz!>?f+9hS2b|-{Hj0|zmLQ!a;)6&K2)jf+ z<+@Yx#Cb!+T#1D6j)XXJrL7K8B^*FaXHkikl%AK5*aisjdF6YG@!M0`B&tY3_)lKN znHsIg*&%JEixA=1&=6?3+ve>3K5u^VLXVWm#~+NbVj=1H`#DsMZiPdr?7wZm^@Op z1X2pz{}zC{QD3q}*l5dCL`Dn4kse0v_MgZr}bm z2!J&bOw~d8bbQF_R1Un4k_3x`bjT?54vu@85mL}Y%Gk|wA2|o3JOIK3Jbd;A#O*nO zfMQu0LvK74fEzn32CadD`JnlLE(U|?hOppw0__8fU_-$L5!Ac^c$49f(c zf+^5Xr|>4AzuZUznKTUrC_qBP0lrHG52N%U`Z>c#+6l(0D5Ow+fc>^Y|5q(oRS0p@ zKz`W%-fzqYM!W{d+NV3PN;U)L^u&Ldz_zV0BaPE)|8AYJa@DSJ>$k;AC5{wY}FgYGDco$5TfTGas zDr2xvhrSh)WBQy5`wu0=NDLuzxs*#%vf*=#7n;2SegeUMK(l@vF%}RY4giU~ZU>?g zEVDke8^7PMo7EGPp&!0N3m)leZa^K5*bhMeh62=uxMB1x4KhEFSce}jxwYU(IS7F5 z4Z)sTLV=(k9fpSpFr^A2AyX|x5yU3H9}5i(fO<+k94CZ?jFW%LIcQQgkmfrOIc_D6dR{Yw)E!7zSCww8K-_#^`wl&MJ*FXGq#{a6qN@S!=`!}ck**_o zti?LU5J;o|(F80-L6RY=R4S-(>Z*Y9MGgnh@eH(NG;9XQY+@@u1P|4WoSU?qBoFGr zDJ2lUg(jvEG7y{x2RVV;IJl{@59&KYELwj`qWTUGvu-)D;>)KN1R4#YOi}8Jvj)u( zu#OpI+_MRkC~g)aTW#CRgF8Y#p!aw9&)ldU403NFoG=er9zOQBf5T zUWaG&=lA}C7x<8Ddu+gwu1-MIfT7s(&>X}fK!gl+P9g*Daa6s%Uxh!%4)37oLoX5H zqw~bv2REzN<{g+pW4+H=~2~5FbgfQ^BF=ivB+5wnR4U^?C4O#fv$Xagl0uH-kzp|Yh08oZNxsggB5D$dR%+J)q(%MBJ zYzj~m!-2$~k0?*EL@DU>+vDR)igcMMTO#4e=-s6u$_E2miG4Z>ru<(pjW7=1)vDu# zQg#B`D2D9xJb}-FC>Yoq2AY>KNU7ZsQLzUM$!B*lxI3X#N_Z232m!|;9k_W=c}gqj z{uHH4R0x7W2>_A^7(l;x7=}U=C4eN9Vgw>Y2q0nvVg`YrU?5WC@x?Xm?ePTq1HhnB zbAGdD&o)50&&24=XJ*J$A$1}N#%jW80z#DJ{-M|Q$&!xYss=&m3xOdJB0wlZdRz^0 zvHOZYc`Q4?>@M8FRaN>=qd?h&&B9?9Em9VT1<$Dk!EjNjYJs3= zC@bwaj*t(;_CDVK$M#7{F-0vURMZes$KhXxfDOlsd8=;3n#ReHW-7;bSFHzadTJ=XdrI(9s^Br0~AUaAhM7H z$AH6uP9Y+R_(K>#@E}HEL4@t>I4Gb*f($c1E@sR$X25UjBn6#*I5JXZQj5{?h6Eh{Yg&;J(VZ|BuALG9-vlqfU%k7Z8^Wq#_Z} zLdw6l{diSJtH@a8Xr!e`6ljRhKvbm~L7}3Q3PdSs1SuLoN>QizBSNhJl!Hh4q|k)` zfAH85r3RIx0HGQ|3Q?wpkp3v~fHE+-(pZQ?*JM8H0tS-+e*d!S1(C6p76FIb>!A1a zP#MbnG#V=Q8|b0ZhIFOp?!u3*2Ebt;nWkx4kD5!@oF~LZh){dgI9+F)18@~rvH=bt z0l+LoAc%+hw+o%TRn+9@ul(>gffZGYD1TTU!9gO*p(3OrKs-<&hA4lgK}X~S3YkX* z!w-~vcG2-hV=>NfWkVNvU`xUmAyiaX6p|u2mrnJgW@fhUdkik^%-Ld!pt*_HeBzxD zA+Di#5UBzLp?t8RP|w8~@9J5oClmf&_ti`$h-d%8m9%^HPI*o$r%=Ps*wAWHdB-tPQ6Zn{wnME#HP{_JaNRVb}3Pf&@fF30| zchYNRUJu^qo>1tqgj@_jh=BwIBA`0anylS?=rlw~$ihHhs5+JcReP@g`miO$T!69H zIj>bYa;-Y?=G%j$V88$&1qL@@QT6}teDn5&nqqonjD--BsVJm*_o~A6lV;gKTwp>D zWTi+cj(OF~v4(KfpDp5JTg~v}wF$sP^(ja2ih_PZDSXkIupHXD`tFvMYa8ylps{N5 zm;cWl4v>TcN~)~GGDsf_;)XdUq>@TP)8D;I2`)L@FoWh+jLnQ`A*LbuY!5%;Q9x(Z zC>e4nzKAWHQKx)LRDOIssn)X_pNmcCJ8^k%_BCMi@2 z-46L-L6L+62Kj2t!vGI@oros&$C-FWq?Tjd?0w9z{YzROKGEgCaz=&kSfy^*M z3c*eg0AT=@8Y{OW(86I2urVeXGXyqoD1V6JDaPd74hb%;4Ha0g7#X{QF46@tLlTV# zCDOS+eM;5_kfOmNLQm!xzo+vD+Ccq3mEUrtKb{nRO-7q2fNB{o5Xg7 zL<;|MRggr&c$au0rUL0R0RIRd5kKF(1E?Ft3irf^iyvDU*Z$v-uSriH{p1Ai*zI*d zm6=mhkRrpk#txpai&zf&UtzQ+Xip;KxW{5mWQ_@H=pD9(UW? z$5^l~=4)7&=uEht@FJp$Ap(dRTcQ_5LJY`oA(TGe94CX&Yf-QeV)+4Kk~Aq!l><)7 zU;c9c=jjc?y-KiT3a`3eZn^EkdBHHlWHJk}&1#bvP^|<@8Hgre>0CbalA(eH0W2Af z9g%!73=zpbo#D!9UbY(DXQ~1l_=yDZXiym7A_rlZKQ@Z?+Djx5N$vrIxqvn|$h(dZ zHbr?sLpR4V#3ITA{toC1)|$o-0FQ(E`S4RQrd*LF0m3vEC653d!Lt!lxv*RgXhgtx zH|!cVQ+_!D#ZG+p$N~Qc)fD&-8;@O0`3A%ySVQ%u+(Iyr?-td8(1>A;*e1$9WE?>V zTtHBif&PNhks;dn4#7F9qOs0Lh%TYr1Ovi;!wU!!BnWkIN2M;A9TW^BQb7pKqLD_> zaznKYkTi!^9#6Y!Fsvc&90}RoFn#rW1b8xpBgj~d)IveYR2cgK4WF^FIbA$&M$XBH zB9_`hC*_~-a;Sd6;^+SAkuk%Wl15rLR>iicv5f=ih>w8CBA>ALRo*fJg9>Z z13CNLr!+5dAVe4ag{}#VOp$(35OUA3HN?0Se?XEFNJ2t?IaS~n(_a_=9k5T8(xK=< zG>48p)d>}kz_Do26ru_F7&OA*e7X8Z-yMgpz#A0N#B?hAiP3;=YS6HJsA~}}86ZCi z6_6K0xi$&#kxQy_2GC)>Nk(8FFTh+k2B;GgBZv=JVed%@VvC|OKQ%WuLk5H3`VL}p z4hRwENJ4eD%?*P~Z@j?1gJ|n@(efdsOAbTP>bcTF8exJv9;JzYdJh302j7&$q)4&k zRLFmEIflNX`$2yG=?P!WQ4tU%OXky)@?gUdGN0<}F%-r3${-h&BOlRVwUhW%{XgPf z#vbc5EL1m&o<5#r=Uy;wbgp;_GuKIRx=LSM_AAx$F)uf4)yvex_WRvST~ z^6&^igd}4U5k5deKiNHUdTnkq^^mINp}d}tdP)D>*Z#LOyUyc+bzU})+L{#NJl37Z zIQ(W4sF{%~`$vrb53{zVVmJ>lhq-x+&@{1(M3|XKryEf>AE)Eb%T?`2b06hf@T+joTOk)A&=z#1a;_H$jC?W%7~nI zr~b%(kV3vV;<}gY+0H|j%=|)IUCX=_D`z9Bj_EF#8#iukXOXFrp!flF}5ngfZN4 z4x&jUkzx>%5p<3@UbbkM-v@|>+(WfY?{)pFh1-m$ZLzdW%OfO{EW+OTInCaaxA~XQ z@*jSC1zyA22K&E%f3Y0sDIy920rx>a1|dWZ`Tio4;5iR)_uTkBv^ZA}74%r~cb&g` z1)pLMC#Sw?ze_qgNexXD3gH2T!^m;JyB)r~Yu`Va&5<9;;PCz5{N@>Cd?v5Q|Hiya zK~InQALyN?zSf99gdq=jjt}SY=X&LQkT=Lq(Jwv@TEg@HyZS+wZCsK3Nd0n=NLQLU z{y;w{$Q%?X#o#({4LFE`2*LVr44`07m^zpsl>F3IRsSF+5DW0cqVN+7!!}pFf`Kv0`s~-9ELSE>l9WQJj#N!6GgsK|&HqB$7!8csu7*J!v~z!AiFf{X|3{*+wKN zjZ}z9A?^p*t&SVFIRBl9{Qf*{o%yLGl?tkgJ%BbL%NU8D3#)iMWQkKMgP!ml0Rj$w zBM>quf90@HK7eYcqPf>yWvvf!qZtdUsk~~Wr7$c2fe@e^2nhmvb~bzQl|h-9D!Iu+ z&DhgAGn=`BbDe}NSFW5Vzo}bDd1M2jleE)G@=Y|4liYR1AerVyr0~tV^ zl2c3p4ni{!vHdK490w!GY0QxjGtq=F5XpzMC@mylFl+>Ao=?w!+!%SL{b5=7dV6FJ+8H$9&RfG*9gfFvduVTKrCh7-dKFv01D7zRK=0Fp33j4l?n?!xI?h8SUn7+qMX zl~SQfs;Z^Fd*8gzpMCe=eON!Z`|&cLU*CP_IRCR->fbrI=Q;7C;(Sjh#Q2`aj%G4R zB78=*pCmrrXhZ|LsU+tpy#Q7-gb+k{40MR#-+l4A`xLT| zDgA%XzWbc~&~a;1Q@Y;wy`LW+AB3voeaDE~9dHeW( z2XQVO#z2h~TekX4Q7hF})gqJ*(mXWk1BRhDmiPW+pfE5A7Dfm_l%o)(T0<9s0L!Eu zqsFus=X=gOj__gnhP2FmwbQ2UnJYu~rWMPNhGpBuPy_JBYngcOVjL-HZy z$e{PJJDf4#xdnmk5IaMv>gB>oGb|f5?OHc=3HQZ}WmK>`{y_9c|(OhgRzjLmf zhdmIVIt^jWauyzuegl8a<-ek>g#^JI0|2B` zVE!Xt8EU9NlW=gcvu5D!4da+{J>)qIDY*wQ=`%HIF@z0^4WzbbmSCC%oq{8Q(XT`K ze-GQ-^}dJ9IJ4))D15gDpPy!nMud$HwxVY!<9W0u;(}G>Bm9COsjrfLz#X0v-nx zxy&YSF=J97Yw&X>rvpH--^LVyixlvrj3Fi@O}!yOM1!ze^HtI1Tj2<*_rI{tFJb6d z)fl=mQ3yToa2n0|W&HZmCr>Bk;pn?Cs1(@|Q-qKCdL{kCf0?oe*FO=bA+P3oHyrpM z$nWJ26Pgqk;7KH^VhI=`34$PqA_#&YLO*@e))&an&^Mw6VS*~uV4+LNNbiTgeWkpvu^9z)54q=`odw!R*Mn;Q zB5&kGogB1RN$3O(zN&$u2|*Ct4FT-Hq_z0x%i!oK{m*lK2Lt-g89!3)cpZbkvnP%~ zG8<6GVQ!tthdJU&`GP;L0qTh-*>aDYYsjCeu@45oe=^2D2~@o;gWHwTge2u5q=wYoX(Y}21p4o7)vP&9dRI}_ z0ga_s4lH;`Rb36nJX|_&%s8+LIXUaem*8NEkPtn3x|?h@FbQfb zY&FovCr*^OW^x>d9FlVf1P`;Gai@Qo@5#f#i;jZ6$=JYC^vH$;{I$o(`$5P$=;Qdh z23N&4NutTW;#D2qgZ&!^bkJ+%tPmc29vJ@m`}pw7(&R7=!IuINvxxKTEEr@Ogv(wXgQbM#0kzl=fh3(LIDt$Kl-&=bbFIyd zAs{2)eAFdXLhh-%sAH#_rKjizl-S84vKqimTn!)`VSR`mhY(=LpYm=tq_Biw8v_K( zjr~}mLpoTd<{x1Z`+aOy#b7wrVGL!k%0QI}l$5zd5)_2VN_Ekq*c(NvhyIss@kL;i zA@x)TX1!7zcdw(|d|;Q@=-Z#t(?@?QaDIJ>N1|O_-rhoqC(mhu$qOW|<_NsQ!FwOL%XtKQ)DXFSV@AAn@ebBw8{sd%sV-*z{ocn7D4 z@Al)r!&wkXbn$U>nn5{;87Tujg$AAPKpXcQs^Gnh==cwTV#yU%o&)mFtqtMEXT(1! zfGm)Qa!D$RWFgtZaTpd*0r=T`Ud~rIuB1p(g{&!vxJkV+MP3D8? zGb>@DSAl0TWT3z?ItU)WXA8(+HVP=%TilW*o`<(O514_GiYMU@!^X#Rl)O>F@-!bg zf&hU)`S|>V6Xt>Rp#-92`YbInV%bZQ;t)(xX)uxp$U@EMMrLjfGoNp#mqHtmbOx6v zfqkYHcXnuCMXI1b0#u%GGRiKJXCE%oMe%_j$AFTA!%|>!#NUY6>2=)ZFbr2{L%Us5 ztcLAXAPL{@_#ZuR_&XgZyENoeBO>N@!|D|kQUoGEGJ7Ebgr9x=9BebdaCz@?5<*}* z`4+YsV#Ep!<4A8)&_7%Rqz;u>zhThq-gD|sGTN-6HauekZx@xoDNCv%6+^xdgWeu7 z4&DYEEIiP5014|r4X7{{giS!`)Z^AeE-iCu;d_IWV8@v#CK`xDlQU^#J9QYaHzB-f zu&&L8#Im7q=zfp>SHc4*Nw4h61W2-sj8O+7Gmsafx!WEHbKduJ!|aG+$FSAFd(d0oE)0R*Sa0#(Ec=N;J$czzxgx;jbOcfkyEWSv&-s~CRUwQ z8ipe`Q(m=+h;MxS`ybtxaxR1KXyhK~~tvK)H#I14x>aZ-gRqVOTDKye&;K^p61PUpRr)S1dSIh2!9 z1JVbiJfL=5b)N(XP}&hPbUh@^1~YKuwhufvh=a|LZw;~ZNj1C(3fSccuE0`Ffywn6 zH-ixfNFC;!UZCejI>(|MLSYG&iIZnu3MH3C(L*kmnI)PH=1kB;I~r6=nQ6&Nf`pkc zf^dSR4mk3JiARd0+mt~gka=Ec(}SCU9T>?ahX%Ijn>RO@#6P70aZ)>=q}1c)_)$!9 z4ImOdx~j9wjYV(aH4iAT)Xpg|YNtkib}AHv{-==Pg0SK@p-GTuyX`5isYO5bDWt z{HvUoI;p78??aNsl=Ol)*mG*dl1&+6yFClWJA;f68O~sDeV8$wOi9rPM(1KR9G7-+ z-jY#4dRe0hh#vxAhKEd$v?lQMkSLMNhUk$T)D*?LIEO=)1jcDCtiHG9dQ<#&^T_o-i2tM}D2kgcU@9phNuI}%b$|h18Xshl zRV*J_ge4~!eo(B4|4-Z+g2BkEoK@=e9_!+s01?C@(1c7$`6Lj^2LtW$efj(l?|@v- z10gU+00R{ttf$Tp!tf0$G6+c^4nS!ji?_3*Z}qATq8ofGOr8;>Zq~Y9a0lZ8^ZA*> zMN(TQf9O8|pr^Dbk^AQ0-~6|iIG~4`SRraCbZj?%7rrSNZ%$AV8Rv;-+6M|(r?1_q zEr(MB+Z#=s8%KbN0!%VtIF79^x=jC^=ZbZs=J6L=?6a*4}!_fZ7B2)>7 z`Ap8UCMbg;gJLKMMuH%wqW?aeVkJV6?BAq5Pu^g?Dtd=Or?-^VD4ei4Kh{uwqhXtT z+yL^hwT6h9+RDfnN3J?zA!r^jszkZhq7_XPB=N8tai5I{J4PoPyk3I%E z(kDLhrsLLTM5Q_cBd53$$qNxE6hbLz0Whnaf#daZ@fpw-Tgz+O2fjpV9Qq6xUhY0Q4UI#1tG(aD}Zs}K%mZ+%Grbo0^{A_ z_lW&DWa{kVRgp^f*KW6=>Y9oXEs5rbe;qOf;m1MEZsiFU(F#+(+CZpkhb)jn%0TYz z=M1woez`}?tXxieN40?H zoxH*cO@KuK{`iiwPWtB2Nu@9y!&0?f)kRD}L?NZ^x!7x?feoh8Px58}g^I9H6aVp; z2vaV{p)m~B>S2mOvC1436hstJONQ_W1;v4ZZE(Co&7T)A@{}P7)O@yj6d~4;86M+A zgi6lv8#mosAO3y$kJD0g!I4RuO(0xw!?TOaO+dnMj6dYCRj%O$nyXHtrj+v^`?_*H ze|P>I(48KHID$LLgph&=fQc9bt%;F2)_pm;N@5V9Iv{k=5X_Z+ekg~SIK)GXC_Kk6 zUL~)GPg-W6odyOF=Y)iWhnzfO4z%d#GC4TT1c79eWST;duOd*Mu=1pzyPAtoMu3HU z&E)`Gxr^sZWS53JN;R7G1JDr&5rj$41tvlzDUqR~s3D)fCRqxhqPZjXo30O3u$;~Z zL8@vkXMmhle_!466yeI|LN^1S3=3&5D3DMuEMDS%-@o-Ap{Ya|L4!g21+oLI5AI#| zZu^`B>iXQH_gVUWFjt2?ob`*I9K|FZn1^H#18B`!e_@bg?Hg&DvW`BHt8Nwf*o8s$@`s7*19fV*u(pxu9U*7gNR+_UV_rd z^5P^>kcp5wH~)SwdCAIC*_X?^y^*Y{70@;a5-_ueFj0ngiG~x~#vPpok~d<+yM#83 zo)%fe$VrnV``(Y(&Plm!3Ia#iE0;4EnMxap)HzTPA;Sz9VIad}2LcRUGe;A0V!B}z zuu4ckYX^fyk;QMFm$<;*K_G7vE+Z64EGk@H#iq3_vXo$usbmM;!H<2ED=~q z1`e{`vtHUJXn_pAGdS36P($-Ch44}9q^I0&_YXjihjbV}j%{L9Cl|vSSL|7o& zXjo{Hc}&F01jUGeh_ZL`yhGf)F*y!N1db#sgVtstv2SUqle8Gix(9SV%}$4dr4(nU z%*>&R)wY(0M`o);37(TA^I$u{zrHjhsnFR_tl7K}!W%;q8chNOh7&cJaitW!ZiXb+ zh6jX+Ah>3CQAL(6QADMM;>HL#ZHW zN1`1>L>nhXlwGr#x)Cib^Al+Dg`|9J?mI#d5Th0rocViK1~V69Lqb@2!0pjOYeXhw z&oD4MxG^T~4t#Vncp7L_bnwfWqS^@UYN4=q(| zLn%sHa#0YF`g4UH-R(o)vw9E8^!aCtJf@4CnvSu6o~=$hiX*GKDQ!Lciq7n_2-0_(r3jq&E+ZeR_igJ6#IPA zCHx)xCWYfK+5c1aI}aYbd}azSqt2BKb<8+G5{IWe$U zZrcO0f3E2E9^n!sQV|EPba3XCB&bzWRYAyY(UJ)GQ~+`ksZm$FRIv!EnSwtg00|X0 z-+oPR~-R0=3NAZ|1q#*Q5z@q!i(1HLP^D7=IKC_4uBTnGdrm^L^7 zKa4y<={$U;tpY{~(p8Jk_Dn+4&12oZPYqkMp|?`Gnk?}LZt++7kr7br)j}|HB1j1! zA^K$vfQTBs>2pbu@qcyg0z+wx#zM_X11d}|(s4n<(?P|+4_dg~HlX-mp@)ccI(l!A zX+hepE-cl=9fgaKIcJJmT{Q))IEZNz*VEdq0T1_}2b1D_D4(hwMFb{?^V%pw+S6S@ zFwB4lObMkCI%Hl8bxFzB!9Rf#%;=lP;14_ruRI-|(!W2*{Hq|BN+Yux9dUgm$~Hy7 zd`s!%J`dZE4E6k@5B1M3f0J?KL>VP^O*c7?t+yO*MNkwG{C95}sHhUAhQhJ7+f-3W zR8HCsV@^NnC!FzUGzchgfjA%$7Xd&~+Y|s%2#PBn3C|$$gI8=-u~bp zCxL%rsliRy`AW)mr}{snG^hZ7$R0E0^Z85s+4xc&xSq)IDtALoaH8IM0HnQaI8D2e zc+4@5ZK<116OJM{e7MyjhY-yEs7{+^`kW!1hM>KN72;--C~N{`G)$B;7&aLmyFl2h zIJiBH7m9?;It{ex6^sry{ANtrDKjJx?#Btl`w~3?!Ypg-FH$I~i76fkpwa|EOuk01urFo;7RG$2iqKzi9O-6;2*dfoJV^p+8elNu?Gt0e)mQxqB(@XZwJEK z;DwY8JFH3vT9+bOJd{xgV05VR5i|g37YC04*KbrF-yNK0fJm0t43s=o;WIWh$d!YN z3iC68sGBB)%7}=sjy%ox!wds$)7RSKXF^Q-9NV*vhuR27M{zND)QIb}wx+yt({vHc zL#S2r4QJSRDcSd?!Q6OZr{QYe4BJ~EWFHVY%o@3-Od?&nvNvdGU~=IGXDK;E<7D^#HXxy}-ZIx;?Fk&o`l88)@ zo(bDj(r#xDfeuObp}x?tW6&x0@!V7b<=2u<8i|t07;!<9RFj$~BaY-4XA_w;KT~v+ zBZ6Yct={|-4{eQ(<}KtZAjl*LB(AtK!LZ(lQu=8j0>Wf3M{?_8E*>++fl(t!hAl9P z2NE`VIBY|7O`^vcbFA@@9tq&{#esdP)M1&f2kRS!wyAUm`ngv`<=U|i4BcYBneQ67CWe1AEwP&YmHD-{57 zbu$z9wz2EmyR-ApKK9A?K6cUM**S>uzi&P3w>$17;+EivAhHCA8+DoW5`x>;;CzYm zgYPkIGJdPKEKEp!?DTdd?dDy?eop0#J_<@G)gJ*fn$O=9Y)nb)FX1KZ7}%qg$;T;a zLuV!+ed1FQte?dvh=Xt-BHb|8 zx`#hcXKjqI?tz;g958@;AQgRwpFP0$rYufMP^6MT_d^5f<$p+bj)`AjjF6Hi%cH^D z+{bA283W5{nGDIrWFCEBa1iZ?4qQ_b074`{a#QhuNKphbbbfH9o`~%0zF{DWDk*9S z2wWir1q1{o6lCmy8J-YJREjEms1HKcauMrEtyi;l`ge&Nv&$;jcVmfs8qHU4KzQ!nV0$X#oah{ zty4~{E2|3YTBe(3E-o%EO_EuXXKZMqiYTIkNKr*46j4PK6;)Iz(<$-`v#tjwkNeAR zIvBXkSSY21B*qS|O%o%6TEr9-7kJ3^QWPX7@E>^l@82p^sUSd3Ob++Q)(XtM#66$C z`%)$#zJRYW^m&NFLGt~zs51m3A}8lID)A=VWfTZ7fGj`({n-Jq3Js){BV?lmLP8Z6 z8wJkbg*2i`kfG(to`IGiC5Mn13AzM(u?I|IUp(fc{v z^1K=i_@Ll|$Y6+-0JBdlGl7vCSODN8#3z2IU(-*BwRt8u`Mie>KEw~B<@9c;nCP)3 zKT1Kuh>j!yFHJInkB!O=1aqGodFtg++r=Y%l7=Q|^G)aVP+oBgbd*#v7NFE{5KJK- zH)$Lf@8)6p5IZI=1#wvo(zgpIArZ@UCCdd6CDJLf)B)wdE5{EXmYxS%1YK4>S*4L7 zm!EGv-1Dy&h7v>qDFOo`5+ox2B{2uQ1?r(pa!s62iH`*Xhav|wqFEztE<(uUauqBH z5CK9=%QFH*6T@x^u}Besjf6H;HDj#lAK8*K<^Droh)LvLn;pf^DksSevBod^!(US_+ZEfkb$eFT|~>7dr^{jaV zi`CBhK4I2^`kM$I14#nsMIq!S9Wnm`3>a%Dmw=qQA(TTj&tT-VmoSP8geye!Ee|Km zJ%jKESOMpw0t|BO6zhnR5&%r$LLaC@&5l6>o_$%5?#A z^ooQiR6(C=1q~VVDmlaaov}2~pzq^5+P*qo-K%D#Ant=u(}@C(z6ghaBuDlD zqWpgBg)xG_QUVkR1qn!~#2`>Uw+?C$SwE%>hapI#Ibj?p+}!v*a&e(FDA7rQz+k^$ zJ;Hc`W(X1_Fj&GRpJ4fG_s1s-GzB6+iIRJ^P3UtZ%r$p#N=txvJKkJy+Ij*oNfaPV z0TKg31uOf~V3esKA_hxFfGLU48a{tpMLyq0QRpg)AqvZ;20%xT;5QgT>+RG-pB{9} z!3C_G;^slQi~^wpOuT;u6>_}C{wUgVnAnH>J1U@>^tNYhBQ)(+&I{CxIZtta~~%KELY@K$w-u1EfTU zFvx;}g^(deV0Rq*K6q#^JRUVU&D287w7`=H1apiMp_dK7gHW6r>eEK0AqkC{;Vv#K z^C!!EW^8o~TH(#Pz)f_VCmM@`#MLSTF0uueCZLTtX;T<6nCB&y66)o_5}naExG+oA zjL|N^C;2e-Hz5RN+}yyJ5zG|Y9EC=lJ1*8NpXA&OdE)MI5==IzZ+RSd^+4O8HMVgk zvPT(^B4aw3%(RIO8=7#@r#Pl-PK{@{c?Kfg!`u&YJ=}%q*fGbh6%we;x`Bfg6DMQ+ zW;AdAKk&Bs@jz%kBo8buVdNad(F4fmC-^jLfQQP`vb-j}y|9p0i?i-F&+r;OBNSy4sv*Sd| z7CSTWUCcYarLl(TkRX<~Awa*qq+6luqG9cU-V-Nep^XH1*}drQ5#lf=bS4n)&O>c1 zm9mKu)<5lwg6ZNxKN-)kZcEU^hSE*U;Gyz6IV`(et0YEDU~J6?ne1@~UD=|C7@W6C zHaX9ve0bu}?05;DoqA0kB{d9jQx~DZlx1kdj)B#9C&@Y>_tRvQ#t@J=gOw*LT)z(u zvpJ8kzDG_+b%n(6QQ%FuQK3s@cVK8R@+XexUtha?_&6HoySuiv&|7LUBV)N=SjoJaxzMuNSy z0vz;v6d8b$=H%Aeb0x`Zt%11T#(B&a0uCX(fo@60w~0}xS3Ic)wK3^N+rww~xmw$8x_sjX zCx!PT?~(lipbxxQswRZmkwiWKe>wpSq)-PYe*JF(`ub0Dp9C?pFkDq2kq6biwb845 z<;)CE9bQbZtgc80vL}#KV4KlXPBtcmprS@h8wK>Z_1qm<5rh};bz<@S4sMT=r8)@2 z+c?ug?#rUH4UC4#xg=lU)rQT42@D`J^D@gz2DOloDo@&@yrjAv;ptfj1k9eUzel*e zz<^6I}dQ?B2SPyP_lyr`-y%i7N!g$LkP-k0 z7p5Pp7y+OJ@F4*++)=?06mppi5@+U!$&mBB58x#kap~#1!H#hJ=jsoXr23{rF-cM@ zQx#f29WI`pNXds!hQY>yyK<2s+I-j_ICJFk zr6TmM9n;YvK4{zl#Scwk6l4J;2JS6(J(^V0V%6r{FXGTq2uLV#Bm?@TK;aZj)dVEL zD3HHbTZ~G=*jzLM0^p8BXW&d=b#L19_~DvAr}hyKmwx7G@jQCCZqD2lmPly^4;}Ag zh%wmqg%q(>69m#y6;TsWFclSP;BZY@Lx(likq}Q3F$>vQGQ0iV<^nhigLWI8+^S`qegB{*9TU7T^4MQ{fOgr-4MV7L4w;joqhhIr zB&Dsco6bX#*zwvOnCv(`kkCL+J`ly9(8QAE}NZch*pQUna16o<5`q#vJ?79qr2!cBI|#gb ze*35BQS+nh-&}nvoR0@9adnxz&!H4FocOs#%G!B^OS==5QkkTJLLnI?bGGN$IFZ(& z;2y;1kAWo8M4_U+@IzQ;$p9|{>G#Lu7(4mWJmEzl4pd4$*qwpR`|O9$dIaqB+rnp_ zAl`H8v7%oHhN-N{z$_*tIzCd(Ar=6bg1i_3>iZ#w$!KR(kOiVWst)#TfG^_hH`m7S zzTD>;kn`w5*=eW-y?&Mp2Z;Vz_8c}GBlx2NTYo+cAbF9b0t5M1D}Y9o6RSMnDR?{g z3!WaNX*J`%G1yoHb_Z(&X<|%8erH&t!`DKUER?DRdZ1ad#7@bH#9dpKO!vi9P!TwV zR%d4U9R5uf+~tqL%W7xcbY9P{!%Hl(cj&?*0+=EMKr29qlD1)la0oolfad-!@@wMw z8OxSBn0HKzZG{eEKL}y$V^L!4XpFuZG~NTq=}{()-I$kJJe3#el(v6gD)s5uCN>~Ch|+q>pT-bmB8MI}TtG>WRCh%n1C zgyid5z}zr`6QkcyRn7u@Qwf?$8SO~g!j?x`m#iUPF>az5541{y0zpXy1$f37I^L6r z42V451A(fgR7KP?HibuhAswX5&qm3fFgWOojXA?bh}C^jUB4{40vwsunv&c6yv?eW zY@EZIxgt)-KmSHJmP1bug=AjVJS zgQ=mm^rZq#q1U!zgVDRB9?s8wgF?`o$=89Ro&3z?69%GV^qHC~SkJ+`q`1c&IE_ZC zs`_K`EV&+L+;P&+`S$2&v#ey%u|j`r!3srb9)FmZ{& z3?zQIY7YqhU!QYS&1%GczZ*Elgx{+~St4dt5&CvhBooO^^6e!*yyx^^+gYrW8zgSS zXilbQ*l^um^|dT+9k77PJjNk-FV7kDRgmrHDAelxV^54(F{e;?JS7v>#4r0{goB)f z=hAxboWDK;sa4B~m`*zd2w{uo6(&N3ph=SzQ!U%ZZ`GhY>JMKMHY>yY!2eQj@Ilxe&x`9H#VElFw?z#jc}Ibtg>!Rub&@Z zua>^N40LO0K1XiD`Z%S-yFE#Wphn9>v{WRJNfCq_J_|0{6f;MH9t26yM~)ac;}CRT z)pBS)dBh|A-{s@G?n(x{nnD^!5g>ubG-Ms5+m>LI#>Lcy5>XOQ8eNksPGD3U;@Uoz zMITNmT~9rOU25U8$*T#+e3~1q$ZZ%a+>L>5W|?9JOCn|yiS^OOk|&cYNh55YLU36k zZVjPj6mi;5>x;2pz1v?$7Y;HJ3A!GVoH{1nWu$UU7<8E?BSc8;7KszS7c--iwX+-! z_&IoUwHQpY&Sb&FQYDyXX%Geb^|dXc!#MlcUpV@j`_t8(8{I9RKeaup?AM&;{@>fj z*teJaX6;&b=XM%XH<71U0mF~2>g5!u8FO)H2u^v{olR#_$Xm1^ys0%gmI)&eVMEqK zEqkJxvRma9Fqn_5*feh+2kiZyenKF0L_-JBiasaMdLe0pVA1z5Lk7_Mhp0``&PBnW zAd#~}n*BC^r)2)QD9G4hY{`OrNA+6`7WEfq5Cgv;Y`uBXS)D!|?d)$$$;f0fA3nYQ z3)ms|BSQg%LY0jHE`S#>Y_Hl}_lLlpaDKw@$4WDr03FKW(-0$6oH&TdzzEYQ-6CRC zm+nAAg}sYxO#w!Mv`7SMzPbXtgT{)3$bbb=B_M-U{Vw)YbfCM~Jl%aagI!SIMSXZVio%YCVo zq2S_fe`!azR4?BgNupfHw+D|c_Y?aT?UZIDfCVce87e+D0u6{NJr`9WYAAp@guTlO zZvY(ug+Sz9ov9MIIGA# zkd|@`0JE`wmfHb9#o%W!e%!(Mrwj4xSv#EJyoX(SJoYwDyA&RN;)m{EfJV^Q>J#y@ z$xtmA0ShTcRoGG~{oKLk0GszpW0DN4-6Czw`1%e1!&o^)PC-M?z&j1P za7h?a|A?7_A5xtEqQZwIg5sH;-omM^ERHwxv-MIe0|q~|5XP(X^;##E8%At=FUEJm z{@c0H1;y+5&T8niWSW_FS(E#g>|1mE?kqzDtMNL-Gu*w zFU|ju@o2fz|3-p*LHlcSV%`t2Y|Lo4clRvX+wo`EK}T?C$*|MSNe0-|4Uf?92oG-Z z*!>;^vut~cFmxtVg69sUe$#(+YHic zf0&#Yr{m|^BeNQvka%xXyYbH>(h-#zp5tv)>Dq`141*LfE>Ka9oZ*_ARc@VU$Q(|D z=vsW3|lyIYzHLzg`)C|3GfOR=YO=?iV5|w!W=Lj;(LbbLN6LRPYxXn zV-8a+rJdVFDiR`r3Gt!{M1my~SGiEg{o{g-3FGrZM384Gs0~& zig5$9qjGZ?xUX>sT)ILiS{=5r7_vktiX1l}I6?2l4rV{UU`QZ{L>R$vL{u_G6t##7 zhN(dx-Szq>XiVf%(1<7+1hk|<@816qBNSu=JAeYhw+N?zI$;Cj)bRm;iJ-x8({@A6 z{Wd@3J?{f9dJa|S=*=w#+x~yhRbbhsB`Kz;sK8i;gZ%}lC+!!;*VVle=rnW^)@~xLaAHclra>Dew_x{$-KIdqHdQG zhVXN8HgSRBUgx+p3&03z4S>Rw0of^t8c)>_-8oZvxGn1_u5_NknlfZ)-avr3?8J3= z#00lT^f=_20PXi~0Mr*8&-Q?R5T^M3YIlExlp+#>lqiT;A_QP}j$ZM({+SM=tFyqG z;F1Tx9X8dUE>o`nnAMhuC47*m3#>;W_uGci)RJ4akxMSZ<-5$nnSSufVW2K>P;dhF zFLv#au}YupA+7%X$U8f=C}Q<$cH|X6Ne41y599-YZ}@0-0xK=(kj32-blhQ?m}R|3 z@TbucQc@eV2yDdipIsC8gcLQ8fv^_*O~VTS6G@z~*Pss(LXaU*MnS~v>1IjZ!0;>c zfsmhliYP|ED6(WJWMqbqVkr_R!9xcgw~^_;_x(YLt%fp-;bQcc=({kJz*yw_}d7-;!UtjUpk>*-K7rQX^^+ZIRM{?SAgcDd7%QU`yEuGOUZd zer`j*l-v#YSy+~Y?#{aH)&uFQIcEg{~rS;1u`?Tv*? zg@Ojg1Yssh$}cbOT4lu`=s!Z*kkE(F$(?IY?%#%P_)yKUipNKP7jWq^>WuQ8hI25N z&gp)xz(yvTLtAG+ZOkDrrw#oG$U+e)60)2cy?{8@K+TbiCLFU-Qh8ml9UhMbo5UT1 zZ7YTy#WMgZjbT^)&`UHDNKyE7`Y$S+c0xT*U?taD(1(bRL4k&v5U9s^&Syeiw`*`c zsRY3w9_S}3;3tJY|6;yQ| zXXu~sk)Q}`|0qFG$-r%)$)H14U0OR4Q}U!tz&D}E88H~dv*L(kFgo9ma17SJiXOV& zF1|W$J^t(wv$}C>9!W}xoYh5Le2v27kWvX1F+~u{34JN0 z4$(~2(k8x84bez36-bdmT?7RiSBP@}yVDxL3}$Uo!Sm8r!}0xffq}L<0TI@_){RL6 zRw8r|Jy6TQ6%s@t5-7}2Mbi)!bb+WQ+iI{`@e;l1MQjkb zV(26hF%i@Q)G?o%5Nay76-`k>Srv>CkW~7DpjcfhnBw#NpR%j-{(Ii_ReSAB49xQ= zfRGW;h<)V5Iy0xOj7RXx;L;~BJ_x4V)P*udk*EUV?iWF!tGGg?DtqF~2x6BORw8D( zE((a4*vCq?kP10a8l;J;H1!8l!=S0Pp1-GlPd%!Dcv%1+5-JJFIEg_eBMcA-ihLo0 zt^^2(RU&q=5W!|{;AZE;+ulUbEF8o8JpsUOYDw_<61P(vN$AL{-e*J|(F(LS0W1MT z1>bOaA8hC%+x<@~eOWlsx{f_Yz9f63>RieoI=W3bm@O-M)gjWvS=iuv&YkBH=JJa>MdMs~4nx1p}4}30l*@Oo%5gbt*#SZ%M zWYE@}84xh0LD?V#jSYV5&QMi(1z^aCI^Z!P2Ne%oC5CjyP&qL#q25|F1|hvMrSzyh z#}3X8JdkjFaNv$6EKdYG1&0vs=xSn0oj8saEQ^Aeuwd}lA7RLM;-iq+X-L=|;Fic8 zA3+1;+0^}HDSkNoPAr@xX_poUJTs9i9Q>qK;#rAR9pyPd(4Rt?LJis{IcHLpOW`Yl75|=f}PCe=+ZTF&v*fe{;{fmCj~2 z-+b!$eP<3%Z(0~hftx3qL(g7yjbp`&aUF<{F^aT zP{jd(!NeF)0zk$nsbN~tad8ID4sCD-7ruPpF$CO5IlZL?hk*<&h6dity&cLkjO8dm z>3fyAQ>}QoDp)Q>ap)98EW}flh=QT_AkhE-K7Q%8-9WO9>glXXs%4fha+8Mp;bWH_ zswem8R4gVy^#SsllLUT)AWS=#MkI8UZHK08eG!|@cZr! zz)qefqKGC;CO4T^@B0^$4|*eLi|!}B)9O=eg?X z>2cmv9a$82K&=HjWtA-#BTw?OA)5@9d|Ny8s^^K429!5JAjJqBA{<5CPy!t(Xjvpe zySoRT!DCp}$T5N1RY-ff$KfFit~vqKfo(#da*lY75Z15srx*oNOeaDL9e+PK5PQ7% z+(#ySM=e+IOi6|~g+#n6=+Q^KL4+wF<|=Rt60RT*IC$_K8(HZCz;MR(H5i-q?xT%j zw7O53C-!=q`?uO3N`8PaorqVcgQp;mFg(brAtJ5S^Z$M}HmY>VKo8Lb0`O4!@J=h7 zp@8lr*t*i^^9NPqBN}fgIeDnZZ5Z-P6=S~U1_k91 zt-yIl&M-6uqrwxqsJ7Iw*aa>yd}Wsai`fg-0Om9Ic-rlLCwM{dOVR_Ugqn$oXo)E+ zNd1H_Qiod(sS=|ikOKcDmglS`CMqaOZHc&DCCj`K0M-W(r#r75A-kGV1qB{KGr5_) zht(%+VEJU+wi0VCM36FI^^@|J$ZiCSwzc01rn;tVXaq1oC?W|&azzrvhBHDr6TCu@ zJbwR!Nr50pLoo=nJB!1I%Hp`BVj3b=jT!VI4rfeBrpLY&T~`T=dyxu50b*(oCVL_D z!_~R71LyC{_~8|dk&+7tK|o_kFY(efFPs0O)KgTZGC@K*z zo_i1;LZ(PnzxiM^a0vnj=L5mMaCDQdFN5r8pq6T#{~f5cl3Bm@kDGr>!dI05H;@cSWR<;vVHzQ;usJEBuAT2V)st_gKJ!s3w1B59Jc zj!YXe0aS2LzfM&kVN#`IA04sX^p08KC{J%dh?eVb% z$2b7m00j_`rr$5Re)#;QAW2CGWs(nAG^E5&??dc($wg??P|U>|#ls(17VBLG2qopq znP+U8Tx9G*?EqCks=xf*c>Wi)Jh7QaG6*6$_G%rvPR3UUi(7+c5Ke5Pf*73}b43I3 z90nICKyZqTLbmPU%gxcz$Z~UY^Ym)}4H|WH@8$pwFrqwUih)MR)E;62Lh&eG#fAE7 z$)@#|M<5f(scLXn6ViegrhkfEr6 zSP4oIDH;IzbPD>A$v$&0@~89j1fLkFG)z%_Yo_4wzvt+mdYPD0;xGrfvY6i@nD;m{FZJn-h&oF&W{1Nop9mxV!-H;4kRCUFT4vv6~PMwDnGJs&SEkoTjQ zB+_xsj0qzd9kIR3genC5LSB&Uh9+bviXxVZYHEpSBq|7sNRgy|n+nli=sy=Bf-GJ= z?)k?*Ae@#xAr2G%0T$Qyj2w_VbOTnpmr$t3fmB)zZxx_>4zo;> z$2k5Fw>+0Q^~iQ66-iZV8$^0xbmDpfChZ&ev3SJSt*5}8cxcjczf>e!{=-+Opye$0 z*uc>r85b8D&{_>c8+<&sEsH@#RN3&Hp05$`K-c40vX+E@L;JqD*2`$|CjkxknIInO zl#qjrp}e#U2W^8?{8$eNMS=4`I87muRJuV7ZvMddE6fuy4N8GMV$tDf`w%mP=kQSk zQU7`)=MX@UIMDMB@g2a4AV|Ufa$FM$JOW+^Z}mLP2Vc*R-8u_zOE$)m(k`5gz5hP@ zy3AmUfeMH+#)SIdGccf91U*H~W-vdt(M#*~^jPvNQlJ}aHXw*d6-h{|BUCuB6hF#B z@O2F}tUGA~XdLTCaFR_@K2%bor9p`WANPxh6o~E~RXlCCJ*ePM&s&7WHo>__Jpp=jcCn}+FBkld5?%91Q>7!T1N~>l2712nj+FbD54!n#cYL{Zo4AK=IXrQt8JA*Z+trW$H?dNe zD&8`wp(Wfe2FA{;yg9ASx=57bbmzY_PTpQnrkR+MS3e}O+)qL+$0A^px*+PB9Ek_d zezzvZ!?zMnrRS(;2t=2H;l5@rD7eX<95jY-_}m_dZZe7R>@zE~MaGx6n0>53mR-@T zyS$Q&IbxZZB;sWc!GXkYy@>_REAj7@{< zPc1pjG(KvoQ4~5Jm;E}LF!k--l(dJ$h=+nMPUeGY>Y`oC#7Sh3Q7hz1#E+p#`;V-g(>8H25F$_AT_4=u(sOy_TMQVj| z&_lAHo+_P*f&SX@M@BzangA&PJ?i&Kb)yMr}w z)lSx>MRq2~lqA&|R8>>kCJP5SF8lV&VevVFZQhXH97nt@z=O2}O-0VO6Sl${#vE?t ziYz=LLWh7VB}9Z~s;pMS=5O1dW~M|sB3!S;p3Ucaaw=Bnb7tP8te(qLBAmwd7UB)T zn5EiSM=-SFzIBdw&m8*dzOk8mU+F(7n15OS51+)Us;a80s=v-3lkx@&>!cU`=pG>o z^d(a+Q|VI>eE*w)yAZ}_F#!5V5-K0cDj)94_xkbtUm!LB<8{9@Etk%}84xX2E+nad{+#N6CPHqW z>g0HV$HZGL1QC0W>qEAs2nXYTdwc27;wZS^sJ%BoGYAfF3R!w;RA)8^A4++&6Od5E z@eL{gAPUtR+SyfYL1^0QPw)N%Cb9Z;tU%ld5bTziz&xbN2aN_+O$ES;^4G4-@PK(m z3n``{&>sP;e?bRNq}FcTz6Y0VU-1Qt`3^uxgoKipKhbj99>$2A;MPy-*Q}%wG|-Z? z%0K4a#YHfbu(d3HwAeS&3|rP>ME5#qH0LlwU-rJ7L{?=gomw1v^(`OG7!)srNmFrG zE7l}}v|&!31bP+trZ0MA^ucrAavlnXfoj?kCB| z&Sd{&c}WPGOx36JPs)8B%q9C4TB6i|j6YR~i6V)#rlJeuu`*Q9!$2S7*f?bP+=_sT zn5t=sB1%$2*|kK8UstaVdd80J>Cxz?M%UdS9-SD{L51r22~T1uAc_N)hxLRpF%1J1 zfTbzx>bmQJG=7I*^@0Fop_JH8&V!h?d%9}}0_7Pvg^?`fBuN;Z<-Ky(8(cqu!xCi> z+#%;Q8rGUA56O_l6odvar|KkEkkLyA57cs=5I~U(fin>kLP0UfG>}Bh86-m;4ghK> zk_gBlAR3I9aA!P-bsl0!^z5VrHxM=ob4AkY3ua)qP#wN=kjfrUkBlqKkPxw~hn@65 z2?ZZOpnq(7cyOYjBZCw$ABH*0@foZq2W6Olj655uz;FHtb@t*@1LE2vt%- zN~o*WFccEd5YHn8N)$0o0#rc@ButeBLR8xhN`|4t!28ZV@edo?%~yEsfql3IQhe@?>9uxjibZU5(vnLAEScm4npkLl5G(2 z@D2hf8-eo8-0%f+f{&@$|0&fiL_hfA4c#imF9(7jV8|c1ME7hjxcWrg`P})qe%ILH zqO1G6S)3ZChnRk=$TVC!O2BfAej@CdnXJ|3!xZ9nFl}MM6NIK8i;d?QpzKT`(WqSe z`yLXVA|}rALPBgOe4{{438W)(BEJz!RRlOY=&?CPKWN2xK=K}Pe7GV{w`x5PQ=$iH z{+dn(9Rc}3EP_Qu6y))$gUNFaLlm&Uszs?30P_T+M+tN&Ln}&|lm@PaaWl|SQQ(J~SH}*aP(4U|pl&hd4?M^XOb`3c?*^E{n&V`pCJe!A-}QbI^6rz&aE z?cfZiv+fMTbT%6m&9GV-1r!wq4o?3*wrw^6b2vmDd{!Q0RWlQ4se%erRjJl)Ns5sc zkqTlEN>Mr4+Y2tMMF9-kZ|}KCOu&RAXdNVzFhyiohCyBPXYq$e{tP5z9`4-hfRjOp z8yv*PIe3^E2^}Fop>=pYcoe}q=pK=QxH-%Sg@Qnsrh#1h&@|)WQhL zw6Q59Lj*#leemGM#^xF}*1crfNybj*&0;4(-VhSvQl?V9^p84^JK>EmolDZ_rY+#g z11#9&Juu|~h;Q1EX!OD!WF8_ONmVh}5t0}Iuy6-?Fo7}19VZ%^VGeDiQdv6C^4Fds zp@5$36MiCK=L6sE40-X@3VUY#~^78^)2q<blQvyRsV8jCBa^cot#bUwg3L2Lzr7S(kT1{XeMExSaq_Brf;D$-T zoj}#A)XFSO8cv5C9s(0YBw%QXmSG0seDC(m%R7f|j*f70q>zz7fQ!X(5WGq^K+Zp1 zm;*;BK1bn*6fX}*cuFgIsg;lbV2Fs5DJBv+xLE-(*%AL$pj4Ml>C+(*9T}F z*HBFn%i~5m45@bJ|3)2%7Hpzn(f%W-w*CCIL7B}|^mlf6G7Li+CQ!2^qN;+_Z%6jC zP9Uw~Z~Krta7PnN!9~tBy=H|3=+yV>X9K|;nEsMMU%pH@?ocX2Fzz3xXB#H&byS@z z9f$~5GC)da{@V<(xq%HZw8Q#QQDziNoJ#Y$;P-P?N0uE2VOyVroK-p@3{;IqIzJDm zj~T^&zh!WDY_%HnLvU^*AUh%Oo=E~`Rd%Ku5biTwq9lZm&T(1L8imX>`b5k}SWkVJ zudJz$?SFR|J=B5lR31wY@mNL@15<5j$VoQFZmZ+<9d*JNbX8!_R>Y^S<)4U7*ngEX zi3wbT9MWVMaB9i9St+ynuQz%q#K_dI_oT87ul-lVI|@Y2jR+(DhSWum8e!(4QmT(rVtjhBsWZ4GC6ItqyK4@;uQHq2zaRzirhR^KusJyska9r27`1}OC6MFr8A&0ZhU<83hrAd8>WRtwWz2%+$Mu>{jsaZ6!Q+nw z>_F%aDsmw32%S^yswrVbSZz`M{3tq629!a%^N-3%{!`@?7=X@MV2NypMhj%P z50C!Wvvo{a%!rW`@Pq~Ob9HSXR6>Yofi<@0BwabXh{xgk%g}#5<^XH=1aN4 zjtEj1k}v>*MF6@qXB_juEmYNl#Vtm{K=F^N29A`2J&-)v+=1v{@2*il43gwelTsfC z@`Gj$MA;cdyn?1?7v;CG^yh(TwkIU+s@!51D#o}PCxgkCZMFxanDVL2aMQ(rO?`I{O4H_2xcREGinn%CF}S zzIi<-@3PQAE-EA1G;N}6NMM5;%8>}1oYWdb%mE&+;4#mK4?qMH?H(Txsv4RgMG#a} zTt}es*!L0jJzqk>axftds7NZwdfNrXVSp5YG~?+jqW3R5&W zKPZ@3?+zqV<&zgGdMuKPC?_yn&2dI0DfW7#m}yeNIt{iZQGnSouR3go1H$*RZOkMf z7Jb@+)^VcUnuSe;jjOmWH}{8T?F|KT(?rTho2fU&bQc;wQ7D9DaFiVar^odC!`AAS zY&Hs_Q3BSd_kRkpFwiI4BP7u(dgwJ4UHHQqvRVmte8cVnFrB$76A^3(rPYi%Qh)Mvg;YnE_K=Kf@LWaPq z!9i#qPxAJ4n(3mjd>RV=woMi&h8aUHC>AA?vI2exVyUkU-w66etWzTeB#;u8si#ykq~u3KN?g?R-fJO~^ULCX-18 zn8+d`=588b;ee7jOTmD19A>Rczy z!JYBJ0;3>Mu|S$^U&zrb;HeUq5QzjD#8p8C*`4qn=4QFPGQ`|(__SceCu2jUBqYLO zttF#D!nMv){Z^7Z_{qp7pppi@K1x|22R2*|IY#9aq8r|`Jm}R4@eoTQoE1uvVtU0J z1RS&ykMwseFk+LC9A|4A%}MJ~SYrvm#9X-u*(j4XgtJyAT@xxGxnxo}M1v$H6+ss4 zI@zo)(miLB(Wi^#{JPZ?$Rpt>Mi2~s7zHtw5#Z76MG?V8E6XyUPCi6XKv`AI+# z{LVNo-)0VY$yI_8Fvvq>Gm4NRs9;DG8*<(e$O1q#p9EvRU*l{ulA49EEmq>s?x9@3 zIMg(Vd66JHgCPWpn7E?>bmR_@kGLMX4v?RP1kDmdB$BZbQb0{069of7K(d4cvPcjS z1Wge%Aw??11kB70A_N4q49p<{O-)jR6eTQ+N+ggWNJ334loBz;h(Jt%#b4?ya0&(^ z5yD4sV2wDKApbNkAqXOfAV3LJO`1XVN&M2!eb2iMp!D3Z+&CvYAR0YW2S!_9$l`fg(N0Sn;S zGV^p|TrxtHJ&6XGl9S2odYn-8ktqNe@E8rTDcE6b_CZ2$;30#y!1f}TVyc&~OXLs4 zQ|+={W981lDL33Q;txi!%y>f=K~OtN0OE{_I0Ockf|2zj?0<~)eviBzu^$+yu$-je zqxNn{59u8ypXD@R2<4Mbh2wV~Fi;jGVgaNnnTQ}L zhHVPs24N3;niJAMdVo1mr0kPVDIyJ6f+J>w$)@4G4@Z%$*j=+*cSzz%voXkpascgt zw;cn;PbjGJcB3c zkm3Ogpb+B{UQ0nuenppQnPd+}7ylV6&*u_9P>_%;Y>tDn8-gHrgUKT#AIRO_Y=C5f zZveRmA(IVXWpqKGPW76LL1y+r_KiR=VX^Cf-KpN1cNoT*pMNSYL*-5~m1wE}$x5buU*2rjpD zS6Kt4CJPX#6oefeUctmpr-cwxQ8l6K8RP81#W^X@R2=#o45w#h1{yp~B6}ZR1HbpU zO(p<+&`l6f1r#*|s(Z{BUyOwSYoT^Taa1V?83id18%jGY4{(LVh!Gy}>eY7E05oJ; zJmtg|#wzUt^83xg!M`HPy-D@N=355bl-5sA`?qqO=*V(mK!{2NnNXAu^$Y<(WZ(;w zKFI{?V3ByzM9DV=gHO6_Q;jhW>2HgQq$*WVNdhqrT?(;5k}>zAGDaZ^W`>$_Bw*(S z(hE(>jU3^zII*LH$l9`~k2n%=RcSaENfET<@Tqwshsq89-}v+gxT!md`TrRM6srXc z1tR|hl!#_X0V^D=&{z+G1-<5vRWyr>F))0h}V z=JXb~zySUTfsknM2OFol_|a2HVwPU=R2ft_hfB*iN|Htls8Sn@bnGc}N0nWBZhS09 zk7w5Ud06b4NL%PC4lkbOkq?g7lsv6H+&1 z1bfO}C9o+$d=NduQ1t`%geON0u?T*D&OL_+A(9fPJ)rkTnCfCgVp>QE(D^x!n0&~e z-_!*hUmhC?p@>RHpo&=kFuUC+2|zawpnwL^J26E0pOoIDJ_W{7U>R8)K)7T)5Ib;V z^MfodbrQdVB?L&u4lCd^gYHOvs04t92@r^&V1fxGfOo6r2;fx-MyGMOGy&Z_uunuw zL^)HgDc~eo7(fySboD4u1j!sZ(Nc%`3gvNI7(gKcKx9t@9>YgX{l_;BPSTUZr)XRf z;IkU69fTqr!>Q_EV?a1M9_P2 zpd-M07O1>cQh7P%OG$d zaG?THz#qg*q#_gRh>(DMmM29}DhT1Xg9G#RPs(X>8YZrj-45IOqMTzCA*5=6POI<# zd^aDl`w8~HK`LN~7Ycxv0KeSO;G)8S>G%CANRNE6VnHR%JO?4`G{VsefD;+0i4b`M zW``ojDpRxZDgRWEk53bmt4&BzRP}WhsMM;Ul`Ec2M`pke3K?wYXkM-bilLs1zbqttTfO)=+=+DV73?FWkO@rGp56V#dLj4^ zh4^2h{PJ^-Xf=-Kg|Gx=pfC>_cob|dH%xnUST6Z_5XU15+&KRucys0Sei6C%?x0`T z3v|I_Tn zxc|}hgE*_}Xqnm0s7jEP-_;Y4{*I(55cmVC-XxLeqK=A4SD^oIu6ZFgsH7;WI`!uZ za5#c>R4F1W*gih45%B-ihpnHkPkeUaO|ALK`!GYrVU}jm+&TK^{6+c51)Y+Wb3%RH zOT>llTygv1LScp_6$o6poYZVNbg5B2eSM7QFI>}^;vG$~y`5tcNhbIoxv;1hKHUdm zzKxB`Jb}|`2Os87vDTdc8b+!G1&oFn7#6w6P>x3v&Dc~UAZ-dMq>&*2ke`M$GszA- zb%+Pf+@)P1p%8iQF(4MY)`dK20+Mcq&#*OMLRwT00TlXXh#3T_5CG&BAbSXiBW%C2 zQHp&OhoBf5ZW1!ZP`obYF2rkWh3GM1EpgNyO9>3QUmzphO`R z8}s^tufM=#BBp{T;1~onIvtgApyc=sod7>>sNY@;LLTyq{`dukGJGrR5;>3PnC(p( z+640x10>$>MbBwPl*kV4Xl5H1X=FE#Ul?Nab=@t38jWfVsM--YnvoiaLLga6CHcfG za_#waoA&n%|4IIN{Ce0wX(9d}tbIt@KqKiP#Z!DJ^@rf{2l5BD#xL56hw3-lVZf9_ z6_Uf*lXYaJ2m`+cQ=_9_TrTIpNo0Z!W`|BVR0je=ag475`;R;iv?Jo)omC)tL2jKK zZUQ`q)Eho5DD4Okm|yZA7Hr&7mF;<^C$5pU1U~mjF!b% z$p5Z5^E!{-yqyD}m_5-$P6twlVB+)H z3lIlMfGGj}l2DLII!;a$PPD zxHNm_9*Zq3DhcysXx#Id27WIcZ^9|7FtU}NzZsy~qk?^;O&}Pq(HBCe@PpbAJaG1% zr1V&+V#SD&m|e_F4^D+1KnS4vN)ix3*alnQU|4FrmP#q9FK62ovCd;_OeGNqWIN-E zLJ~zO8D*r15W4)45x1v})KM{fUm@l5RDtr8g3B+SHii(y^N+zMYNY+89bMZBK4JKt z3f$p;06FS=w?bth^80y$q>?5kB$K#j8Pkw9APQXELc?krl7d@#!r?Oak^4wUO0Rjb z4bq*-`BpJe9e3YXpGlAq$3KIlF&v1g0`WkSf`*t?1tAxt=m~=G^eAz#8Oj+-F7^U6 z8RC@!HmZb+Gcu&hVi~s1kdQ?jab~hjp)xRl1``Ca!#J|@lhJoE=$#$|lKBQhLNyY! zBzj|1GbF{x-q^69_^;{Lm-Ia*ASykY_SzWFn}+v_#_=f?Ea` z1o)q5<5vO`JFUtW-5I3wjT2N9z{4aSAk4uH2@u5u9}w{1d1w<$7ltRe1D$~{Q$`yY zCF%EVcZ1YRM!zUp21MVRQ_KW+@WvKu}K#734#rv~?H?aN7 zzH4cwj|K(je0UY%`G^za$8p<t77eTlD-?DR`ifvI z^ah+DMCRW874eDoC^0=&b%KI2pYJ$u4UuZk+iD-x*K6a=L<3#6Y;8mt$+x5d?%`RV z*8wbp_?@!ZvJ@gyyi`9BBf$}WRLC3(y9x2^{Q^H3@FHv^2Xzg}6#Qc(0>~e11dvpr zvf1O&;5%oE6Y)WjAC7tM2M|aMP$ESnaGYem;7^h6c)&;R=LliQXel3tkDExx6!f2X zyAbpuXbMS+4{%N@8XzRrx*lCvG6+Z_V0VW7h8lLsu<_cG!9?a0>DYUcs7_jz8dxDN zoXtidJ%sqeq+Yf#{1!qVn}9wL0`w$`!<>kBCWCFj=Q%tYHT)#ZG&*(t+geY#ixZ;EJBL!iHe1a5*sv>*ZeU~{s4 zicmcPABbW_Jacc|1q6LI9wqPGu#Ak`aM2;d=#E9v=iAheG041zsLw+j7>A-~D6~6a!v6MGuwwY4L8Q4HOshZ;aRT5% zd}SQv&OsANTl%Qvz@;^st3#=+$1oBKKZjV+uO+rY{-{h>xy$_UJ4i!nq>&P9583vE z*GWS~@2ikHy|W!0963&k;#gyN0pVes5wt5+hp2eH-suP<0H3<9tXo^cA6c2s4ld}G zHh$yt0Ww+PbnkTJZ_IJ?y z3!YXrP*H1BX$i>^kdO%pI!mF?%a)=7q7R2S@CtwBD07&JSMx(d#slYLsBuA3FlbY# zcurz1lZX82Qw0tQybv;in~*$@<3i5Hs%?3f!@Lmi`Nl~UjH;zW(6-C(vRRG7fk~4L zi=vlbWjvv#$?XAzi`UfSkOT-CAw=0gQ3t>-*()6yJND*z4`6Y|AZPYnuY7m4Pvwk_ zC7=dWAjgeBbHFV5ll8$?L0JbQB}72j#AOsDL_7S_eHb6=C7>991?zy=0q-LTAKg~2 z_#;6Q1=XvI2l*@yb{!~?I$$l#ghIF=fe5I`qB0(?474TiC){_@z9u&el~hp#Prt5k z8WAEo0OKo4C`%a^k7=4%ON8b$pdBI>h!BGHpFc6+ELXL}3)){`baZJw8lbLcx1Y|y z=5}xh@IXF_4ix{Ahbw4H{T~03`5aJm`aTIH1cYPs5*Y;cksOV(3EB56=m+-A#CRv5 ztB##t&z<1-s*4go zR5Ssgk0}G3v8f0}kq8kXR6gpHGSY%H9_VlgGa`rBvZf`fDh4G+BnXg#m`Ecebs^1! z-tT|5yF}_sMzbR2=xBw43C`m&Ly!OzK4c4lSd9~vK=C>s7(@;zrtxBqIee6c(9^yM z_cUI|1%nq2u$yCi%YgxyOmrOwFP?k>=jV+nokU1Sv}NJQIC3(-IOGD9{R;GU{}>;w zKbvD1bYmw787@)k;v3@>P^Q>H+P^4=GoUA>WfUSQP@ot8U)42Zka69!0diPzY2T6jb;_qiGRcdHK?<_>4F8^CN=+r`btA~{Q0))j_DEV~ zy18w@|M)aj_|1*`=zJI$#O7)SHO;lazH6Et0lToVO(t1_l3OnA|t?X1h0tnoSckU4PFVr&G&NbJlY5t4&-6XF`6 z=YFtp7G$x2fFL}X$@WE(%Qn#`NsK)1kmSqw#UI(&tlknsFTb7sbI3gq z`X9(D4ReDw;TE)h%i`Av~sx; z0QHd)GA!E!He{uGA|yx=aL5%(R8N#6nwejBufR0;dtp9zPpSV?y&ZTF#1Q^KL($|? zALN|%5&~vF0+`Jh(O`cs$2TZ^E?{T-F$`%n?qCp|GaDE5)3($`nQnrXZ9 zQmR!|XECgWr9sjfLkA(PFo=5ta4`X(_5c?ER^kmfPK*ebWQYFor1Ou%)IS;8D+!&< zbFHg2B6DQTLt!Cv)A5hDeEGc^e%Q0g@CTo)A&3W`sA0?k5=h8Iviy%YO?3?|hd3uP*-SA- zfrWS$1{(+9k`sZJ2#zW81I-wG`ADdmrU|eXuDraon@fgCnmTuRPe*&_gqr~k0{3VH zVmnTtqc~9yJTOHW55^EsPBb({2>?ySP%;C`K}QqgfK*D4hoPu(1tt(AqzM3n?k?=c z!Pcz6g8RUrJRm>=ZykWK%n+8O zLr8WC5!UVvcO5{WXjj7knjkI22;zXUUU8tRD-D^f;VjIxFfl%SOs&jM`I_dY6uHVy zCP!~Nc+@z~av%&XOV}$~N;fXEGcie>u#VFaD2D2}DTM_rR?G%)39$nA>^zY14IhC9 zY|*q%&;rhDWICj$as$U-i_^YekCLj2DpcHFE6)Bq!j^hC%^$VX{JHa|EeN`Taxlo^pXfw}e;LlZM?Sn_CB z+lU>f>*C9n?MV#~sXxN2N5Rf-0qjV7WPsFFpb4U&W3mC_i8tU(m^x69pd${@PupGq z(?>fEc6nzJyu1r13HYsri_XV@dfj8ldJjwUfP zRAC@yjaugh^9-8}LZ;V*n0byVAY+V!!5QG33{H?T^4&}3JI*7#-&YbDvyaDWnigE3 zlt7#f2em1-!D_9vUP*By|BQrZP^N0Aa#Iiz1c5UG5Frr}5H(W3LnurH0|3h`06+wi zL{K#p*a1znWDL_oi`@@7fy+Sxl93e5r65rapDK<0=V96F$DX1of2)qDL4GDJA zZ{;Zx27u>_qprQUhhE_N+STpMaL8TWF&8q2C~QhtMj<^u2E2pdRPzFeHDt*ytek~^ zLj0(%1Dqyd)Tv!3?uYFIrSYe*^TG$O+uGmMvEChV5|?YG66M(-oq@55XB&YC?x$@x z@!*TZ?AX<^7(cRk2;5b7+p)HJgGSjk5h;_H;mL%@aNv;PIt>HwAk7Ca>FDWGuB?t~ z)L@QgVKafZ91tR8A_bvED3;Kxkz*|i%9SAm<8^W7V7(=CP^VVjNJ7n^c5yCkqn&7V z%1=m6$?D@%ZVG5BureYor9$dWVcu8c)xg*{k6B-{9%;na660ZV9lrn(1oin=dIZ`J z;sbb5aS;SEAc0H93K@VJJgWDN9z?UjZ60DWX3YQ3!Y^4z}VI{N+v#Gb7IFSFTz$qPPLV zsK#JGn_nwb>D}3#=%$f2X~vVIDc7j zjp?%*ccQFz+crf+?+2Qq17K@&114Ew2+|2D13YwaIn69Qzpl`XWuC0QO57vGNzr@i z@rQ6>0z*WhxS-(Il;S91ao8S&^4ugnfNV|VPGs2DBdHhK1$C8o{GbHt08p+bKCSbRLOSva^AS+<|T$U%~`Os z2Wqh)kqE6l4~ms;uscD!2w6sO<)+J@;W}$cVP=2V8$|bcCXnHQgT_2@%+vV~VM&Hy zqzq`syK1-3yTjj-5%u(KL}{kEqN{Wn6LqkH&7uFyJ-T*}YP|R|REKi9dB9vDFgPJg zv9Yze0`xT8MlZ?Hiy@58E{x>k6#U%{@T*gm>I_?j>BTRoOyN+WjXOhNOpI_E<`a1) zk||jsIh2$(n?-JuCIc2uKcWiO84tnY-aJL`ML>j>UESK9c`r|v zrqD)%ibCRK7>5xAt;w|!(fw42C5%ur7$tyEso)F&LWe8*>^3!+5JQ835*jH@VVU6T zh?+^2A{=cvGt+Lnhr6w{V$)D!;F%JI8GF%?ht$+E6}>l<8Y;W-c4Mx+Z`Sp=Cd^g~ zL_v4KDOF2lMdZQs+LxUorGO_7h+ydV_C8L9@OYA{k|>CXcng3W99kPTOs*LU5CVr; zi7^-z1IP{TC43$Tn3}Icz;NLZm_{^07AS3laA0m4psS!fJtIIwGEffC*LPw;b7o1B zCtoF4oEs02_e8|eM8N=b2huJ$63Y=KRZ&DuP=u$9b(6+viIbMbrpnSBa@d$4VFW2i zca$(9o4M8#K+N+3kgzb&R2DU|=ubWJ?1PMyBXdT|ogFVu_yN(4OLUu3gG4vR9SM#! zZ()F|m1C4EkTb*gIX8}SA|!x-iXj7%fgEHqg%zqm@`gd}zFi@JJ{g=ZB#^xKqh*!cMm-HTL4w5o|{gp3Yqv`cve%w9ZyZ$(8A%#+=In5&( zL~Xs{TcHgk66A(MOkmOf&^all???MyiL~V)aU@Nl*^nX1D2KsYgn-`kg-2!-<0e+I zgf2wLe`=uB_N$MJ#rdk@Kj_^%hIle}B2;8yALA|QBy-{O|3Bdk_y0fH{7Ys2lIulC zJG8ttAoLkMGg_TF z%Vad0uw=f4!`JxbA((TqKlDV_|Sm8L&UvnD~qASg4TDYf{{;f4tH`+ zh<;>!Gu$1>dO~RKh?&wlRPsd(gnE(l`RCZGF6UR9f^Ub5#v*Aw-cTU?T+o7>(P`ns z|GG{+uly|@G0sq2ASY?_)`P!fW5uK#&w>xZ3v zQeI=IX>%~&_)w1;j-$tp_&!N86WrOz@QxRJ#eO96zLGQtfcQLqtDa9)CQxfPJ2iQQ zUiS0D(T(w!%OJJiPpVzS#;~)VSQZISytbht52_T}l{Qz{7H%M=bg z%@ddxkcNA{&u_-Aq!K7AL!f1O&)pn*dk5iUIb;5q@R@Vyljc ztNK+%3qhdJiHiRUVB9e-hfxE*V{DF$u2o?uqygj(EofV+8Kc>RB$7$Zk~jnMeHFS` zL^u2h0oeG&6cBtt0qGMJ4vbT;;S7maRAGT2k2QdQ_{{md0 z1LzahG*ZG4e*^2g-10K8A2fY>z)Mey(J^?JOff<~_P+c9hGd>XnTaGm zR$)0I2(W+|dwNwifDH^oO=sQ$`4L^3>{@DX6d)&nkikh&BvgFi6N;={j3UW{iL0dL z=8|hM9Yc@RTM&pIz<%d z2{A81T_bapb}Cqlp&%S0MM$QiZB~;D2$}d{$Q<8#L@)>u%>bgG#*09Jw9o>|f&?f) zKjrm49zD_!L=#HIL{TA1gi@v$ow~==&ZeWH-M|#lqm4TG8aFn5KD(fdY8bVI?nKA+ zosiBq`02MYLyxH2&NrlN;OMzQW&IdCm$(Gl8)QV;2r?lO$_%exU^{MP3I}>2RGSut zpcyhiHW>B`AROOdoKD0dYTgE+Q+H}RfY*fiL+`YXCS$^?9moYL(kOW$QtAm1!8?R% zuL6S@ac$?v?V+EcWrN4KCu7Ka+fdI5iRJqZk$2x6%xyl{h&3CuW$g!146VUqymtU>ZZQ{sfob z+6FoH@&XB&`gwet1T7pmk3E1AgnE$4CoDS1dzk+h$xrP8=StBY3`rgn zRv?7+1r`XFk&>EfYY+&g@ZzhUCGq`m$(jYoVB%_!(l9m7U~2jOv@Sde98`eek! zAXTMcVT8xgFKxmvBJ7F66ckg{7RJX(2xZ+wD1<-r4Ly^_jcFiVQj9d3rh;F>=-_5d zO3(&~5^$9P6h4EC*z^3bWFn*m9$*9T5R{VxWd3+1Lk0W>f~PS_^uJF;=^il<3*d|BBvokyLXf}_0SHPGfddSI5G1HblnV?EAO!^!5ektZB&tvirPVV{YXJof5flM9 zKYt=|VF-wT14jbS5a4C%C`gcmb%|*RKW9R2^=iaC1AoTVP*8nG10YO9YiN=m2oC=C z5&kF+k)&}8<}y0?^7uVhvki-2nFczh?|7P28A| z{g9{dz$b|!3POm5#s=t|orKgI{9tpb?`#b8lo23H1Q;^^!21OCpg(r~vuA+CL=wb2 ze;Wc8`-`ZCYE(paVYV@GI6u8mL)d!=$oAVp??d;nhYCRe#e@cd8c0)MFnYl6&sDC- zkcl3krh}_`{^$~ZR&d724T3`w)G}m%3;_%fpN?>qQoI6c4aI;00@0iSEyke=Sx#fP z1Bw8A7$R?q9RCk(7W!#uo(V@=4T%#r3T`eJ3nry@_-v;*rW@Z8@gg5EOhI0L-ATVO zS_I}XVQLB>NFJb{>51yjFiW@43a=}f(fjd#NfLC zc|eB0m2hRlPR>n?Y#P!P&J_56&;NGNDOiCPE4eCNKlo;@@xAn_u?vY8fE5B>90%FR z_YjQmI*B6!V29Lr2&WC?t2L$M3%b?RJgFk5>HnGkR}USYGnkWYwjqG6I?%?&#Zd0u zbZ!FR%yA^mjj^N4h@hPuHZhF~kl}_L zqiU)uNVauVRG4X^iYkCqK$EO!VTK$Hix|c+v5kusF^ptY1ga@!2#TbcpcrMKsfdV> z6;+~&BdlUHXk%E>sff@9imhna!CPUi0}cVgNY2}BwP=EvkT%G z7=_CbB_gVl1*0KD1Xv}Ik^>Q{~?~#PlTeU-VbGd0##E*QWbXWp;Z+`OH9*KRTWhtVcH@sIoM@zCL`(yF~$(g zO_9$>A9Maf1QwA5Pa^_?3lahL7;+#WH{lx!=mAB2d=KMbMN~BoDs=h7LG@s<6)*w? ziW6>+po8zd%TL*nk|turVIZLh5FjW-M?&$A#XKZBfUet*uLo!6`3FZAt?-?HBWoWo zkBhj+I8am?bb2xGM7)6{3LmbV;nN8^>eGI;d(7C68pDy+S)lJ`LyfisJTn-|mWps8 zo`=Zh=IJ2q79tEg*oOiS`?KZIZDM+Gb19lcRR7B*c44uaQ;+(pV0Ona54_mx3>u1J z85A`cw=ftcC$3w)qLVAKyu4zz?#pc=hf?{@irZ?WxE?XSGG*6C^_hAxG!H0n3mxL2 z3_AtRWz(kGXAG9}1ycnHP~$LJ7gVi;g?5~onILzhJv67eU}#_hGKc+%gMvXg41vRC zBZ8CHJV5ijs>H;E)X+clOKrILhpn|D} zpr&OaX%(PiD4IX$gcCBfp+M3pLRA#W1$7FCL?{M{T4iZuqL>0GAP<=+cPg}$g*<>A zIE4bK3Z|h7l7)Mo(0__lq`<;~p`_g~Wm&=24gyjk{nGYAykt-ILV)5*S%mz?lL|i` z86W&rHWeQPh#UwYWS}632pI@w2_Ph4#&T-dh-Lx+frWx#3JL%rU}Q)c2qp#*f(V8Z zAdrBVA{JOE8Uc}lfrbbmf*Jxy3KEH6D3%5wWP$<)QXu9qC_pSj!ZNHX9ti=MQ=t+G z3t3Vj36%t;|etf%(s;eH;S!<4t*~s^!{d zfK0(D;ekB4<}p$hz|2d$W5-xtARp}KTp*yX=-EVycZz7UCaEN5y<(89^8Ry^ddX57 z!S0qwLl@tV#@s4LTU*c)^O_bEaE7pPYxYr=#Rw!X+n6n}fC}!{{(6cRigcv@El>(LG-qpYXcex&gJ)6A3VpNf+p;CG8|Squ(9|lE1m^o1(cFe0AF~o^0;CU0R^-HaiQ=>;sZn> zL<$xJJ)Mg6jw<}`nJONAR@HknZ`76VQ*C2?-h2up)8XgR$R2i+1$P3g4IqUF96Rfu zPSv^D<-_N!d6VKg;uR}wm$_9Zim&-mvRtp2E{EjcK248;$K>=s;5s@xj)3?dBg*y} z=zd4&dyYWh@O+-|AadoSbCUt|WWkYpLPs+Yp6KxdcmnYW3L}C$1ULvGm}nDYhfC8V z9&C*0fvT{NPB+?)$Rh)Z#}Q+y9b_%6B-Yx(n;}84*la8`78o}d8ZckdTnZ z2XH8aI|B#fz|pY|h6j=NLxF<)3kET+@uq_fE{8BK4mo zb>@=?C_@nplV`+}3zms=F_=`NZcBj6S%wh_aG(qxM(zt>&}lXd7=|WNN}whPiX`s_ z9=8j|+}(15D6JWp?0q|=$M^^T|Nl4t|NsC0 z|NsC0|Nr(nBln*O6hI#uss+B_3J0os_#XS4gER-ADX)EpqrSit51;@5V?g`gT|0dE zq^fFseY@xYeZ9lJ#*_i2Dnx)p8ZONMa7YkI&_4IgI~}6E-QL_B?)%#FO@nvLyWOn; zfl0NWPMvF2w%F($0n6Lm*7sYld*0oy>g#os8;5(o`_kAttyZ}J^ag+v;iu2O?GKCX zuX&!|UwM7=uFX=6Yq8Ns)O}9nQY8A*vu$Q>eKS)$ch7}1;0K@+hsuI`?#arPQCrR~ z?uXOG>*?sczykZaxdepPvIP4bJ-2tjJoGg6PkOJtuN89LwDZ>M%r4KP?)v6N8$P!^ zZHzq6w|BD}KDv&EOP)g@0(*C}umXV~LIqGzYaVU)JEQ;rO&?~@g+1Q;)}8d@*VqT2 zUv_)#v(V$+>(WN8+g+&Z!?ZNpJ|XlkU{rTq)PMq`@3=ZX002W&I%-c&fIi;hnzPqB zn-%Wetv%N7dk&t>uGH_n>+apJy;5j>?;mvfyKHqGyB*t0UC$Rl(wzXrde9Dr^V~WL z4w)Z22DRH62>{Uh!S%TLeHG4qa0O=0+u#7VU;uqOltl{qX+Qu0q1w8(w@`MuTmkVO z`h6dGJhz_c00Jcm^!g5{J@uUdCyndfub(DX_j41KzH#Zg_Yf^{F91@20HsHBqN~q` z&mHu=@4fE5aoO%`cQm+t-DjjXw0pG=r%r{d4b^XI*LS?+t9|#UW6*ZM08j*hKm$Mx z08j#eDzpFq1CRg?fB*m#0lWnO002Qkit)0C(Q{XyK+tHT-g@iZZ~&Kg4(^?jWv?o=r*7t&&C8kP z0Qaal-MYP3M%%8r>(lIc*0k2IcM!S@v7R4i-uG8}?Zem&sos0F=`kM1uJ3xg+`YSQ z#_wMDbIz95^tSi7x4WX0cb?~^IIX-1-HCL1R@ttPcD8IcuS={9?^}y*(Yw3e^k=s& zqXv6Qs;ynv?=5IC0w(U@Xf!H&)~_n{Phj`}ecto8+}j!jt-Ia#bH~;2bl%!;J!tQ0 z&2`r|2fNA-B9^ak?Ol4Y(d_``dh=c4XbW=j9syJy+6F+)Ru^u9fB**OC;$L<)B#FJ z8Uf#6>GVE@0H6VV-*^Cd0Q;V4zPqxx00U62?eq_PH>cc_&UMzB)gqKA1({lei>asi5-(b-r)7D>2yn6QZ*xPyTIyF*yI$exAlRNKe zP!$BD>|wsa-RL*CsL>$?&K+t7Djp7wk1y=>FePfwR3 zUQ8rgZnAxR+dJ=u$?tX=KAs&usn5N&_n01`MFIKdsOl4i1ySq^7sqz$g)JyL-%9J>I$D>#kvXXJ;nqzIZ@mBkm$`7YUDKH7p%tGrj9_p>``>~7p&ThJAKcX^#UW9uh;g?4s|p62*HjXm3i zs`l=A!S~kn^`~Ym#-%i`0MJOKMcq`QMK8NK&d+-G>%HiDN2Prm?K;5b-C8^8N4Zgn zdUkF{X97BTcSeGg_T@Rfy67JhrQC0aX!`kICLZ@(IKI8a-F3^`k=WZ0i;7yPk4Kih zc9-4KpIctJ1z6bUV2;=aAUdX-yRlbqZu{?^_I-xCg}ZVX>xWb(cXGL2we9uA_qA%k z&0IC<>z4bm%_`5kv>9`?o2&1F7*vqZcS+}gko1yn8O>4UW&7fnkgvV!)4gnHpx)NKdy#uScRki*hNojnb)mL5dg%ak zqjR_(gg{>MJ$qhTD|2*brfa==os#O^x*F}y?RIEoV*0jo?W*^k?|Z<+_6+$9t9N|f zgIIO2)9A--nq_J>wv4q!Tkm&z+bc=78nyGC)uBqT2VZ){V}kc#rM)j)_pf~8;)Per z`SQ}Th*f93uHD*o)3?_ueRpfmuF#ay2mn9=XaEyH0W<)ZnG+*T35XDSDXHn`OcdII zDWD<{K?DIb6HOX1GBr;W+G&*aGgUvuP3mbFQ`8SBDEp`g&2 zGBj#>nUZFN(W6M7Dd`VGBn=*>)M@H^K_{wGB!Q?hMiG%T#XU7NdY`G1Y2==xWdlG5 zk_LbP001zBBp`sA06+kZGzp1_VnzgFF-+8Y1i>{&g*{IpJf?vXA_xcq06+xO6Ce{n z(3?RRnol4^%~K5o^wUrVdqETO!|0!9GOPM5LCB0$KQI24SPrUIw%$sjl-4_1zv$TA zyhfpKHmkL`m8~$bW@y=Dk`+LJ;xI%?%0fdaB2x(=MHu)P@kvq@!A}vW1G)B?N!^ zlXM^Ye@5y)hrpgx;mRXRD4D%OZKWwb4$>uZtiX|)P6mYsiW+IQ_?qKxa5@SZnP zqw{%+CbeQFTR~Q|Y+GScmf7kJ5d~w?S;ap4OL$Ckdvow7*V+3S;xO?WM7`50qU%~x zq_v7WtGUN6IUw3Z9z)4RHA|nwl>iaYS99eu~L<#tv&g$oRqC5CEAsC&|UD_LxmB6 zP8(KbZE29Kav;?bl-1fnL0n5}P_Vm6bfPxfOKB*fX=E+2AyJ)^{!Y2UQ=*j3!)Yzr zrnc2=mey1uU?>XJ8U=zBzUl+#$e>H^>Y*s8nK32*7jOIZFn)|^i6C)roOw}sYBjaF zOK^Svg#YM#d!PRw`P0wozLQ^8(L*|GOBpCwfn}vg{Lm{kRh&~~!duqn=00|AAMt-L zeG56&KWr}?(6tpFHnz6Pm`y{^IFAyupQ_W4?dgNgDkW;$jL>Brb+B2GQxUpZYi=AP zP2#-dT^ne?n4%Wf(XD#EI&&Wxse4(s`A`Xk}^I2+>Y|Uuahdp>xjFsR* z(xeL|N4x%6?dg|71Wvgw>DamsUd|R1xH5GLqY&*ift@bfEw-)0F+pt2F|4`G473w! z(gUrQvs=4>00g?<-+J}y`q!U3-@kvS%d7__YU^BDg(8HtZ%H)P92h7<35X{dhgxvw zR3{h@X+s6GkR#7yU^eGR+s(X_u`Yb z7259bY5(5yge)PsQk_0O^ozUKQd%4f%m%C~G$ftqN}e3tzJA6-bUJqgoepRVi4D}A@z?=&1okfzZBgwsMtIwz401f@musc`t0I%y`A4kzuzLw+g&tHJ~;owfud^VM(O{s+c`}$tf zsCOkhHn%q4`Yug4A2^o>3-{h~6giVgwuz_2sU#U5(!tHcCDLBPLh?M7-p@NDWdNOP_nkLI| zE^al-W}8`1O!K5szCQ>AAOqi?rQYn>V@Tnm8Elsltd^i+P-!Z#rm+WFP|2}bO>stA zmP#@pG2Fw*l-*k~X@v+BIpBk^hKdlu7&QcH6cPUu-#BfuB1R}_obkML2E?&6?-{m4 zNuNf?!`OLna^<;2#%7Wb(7tYldFbh(O#_lyaEX^44M+VakD<9d9!ynoEkO#E`stIh%ANHBRw@|hYgZObXJtii;pGgE%?f{8&s!|;zmAgOoV?Ut*316aj(IA< z?hbW>sDFPyuTFJNX3K9NnG=W=haqLx5|LySIUdMzJbZ9}$?UV7aoK(|GJZc%xc~kB z73;UV|GIZ8Ss9%=SvY>NGJwKKGM30Ae?nLD|7&&Q;gU1@FVMvEY! zh2_D+Oh0 zO`Jo1J)b{Ti4CPQVuwM&9BsiSO?2(awiZLA}g^MBlhnxHQ|d+ZX#fB zDLQ$qIB)rXW#@^}-r+5+%dsC$ONzEur68Vyb=NZW3NwP(EgQ3~4C!=bFQdo7_H_tw zJFNq$(q36*IInDzCgsJ*tm1U;j*BXqqE@XfmMmixYR0u2T9+xPQ~bC2w-1r=yQi2p zj!pUp+mnGAsn%-IE&qmx?X$G{&)Tp%JozwDBU`a(*=({IC|e*l+fZ^8U?HF*GZvvj z!5}DzA`*^THF1L`wqQke9Hur~kv7)pZY{HHs;hR_YpJ7Fj;<=hV#6VB&bMsZTdlFG z++AkEF54!}%XMpZm^I90w$flf;KFeW7-Hw}a=eFKafEPVkz__S2K;^$?&ddyAawV8 z4LN9-(ljpzj;Hf}Djo2$AEUE`&23IFw^cN@nYk=OU2Tlab=XN@+n9bmjS5~6)BOnLt)r=>W5pT>ID8`VzUlSV@;L&s2?+=1uuoD{$kJ94Vg_TBhJ++hsU%2&kcQfeLV?-0UrzHoX(lnMx!h(b zDKVsSd3wv~2@aj5mL~(c%O6Fa(#JySIu?3EQ4v2^)AZxxn`o%`YNadh!;|u#0v(V6 z7{)wzcMF`mt*^zq^IhFeMrg5~y+bM>`|uyC2SMG&E29ZPpoeed|1>oofBPsTl0r_f zq;sy)kDB`>quk$77;IJHiH*D;%Nxf?Hz#~K>1eRZXS01K=H_nIaAy|KP`**p;^#c$ zmiWF^`op&VpW9kG?nzY`)eVqrEUO{0KUjTO5AlzrfjB=>cJ}`+SfAl9Z%iUoApn9* zg@z7MA<#V_y(ali0r3i8Vj?iWFaD|4CjzHpV}eR4r=2)QqRAR39G1hlK$>QllBNkm zOOk;~l8LFQprIW+KnmD!fv)N+!m6ffCSZ5|GC_fz4TISQ4{;77^-)n_Vqo@y4&PiG z)iX386llI%YiAvs$Dcn#w8vGj@0UCd7OT?B5Ed5*|FR6pXe>iJgpQhQkZPg82NR}e zil`(BK{HYmG95~yB94P@j3wutVb^5-viHi{(p^l=sab(8xi;vMco8CWlw^Ttj*hq; z9f(ZByxAg2kNA>6sB(^m>4<>;iZtKY?EDql+gB(;i#kd^eKg*mf7QFOdD*yWaKAKvT z!uv7hgl!N$-H*z|OzQkIZ<)lQRjB$>8hS?wI~6R#LHnAEAG4 zFh0Yt*nbQu;Qu6YW0wQJ+W$e_le9!0*7iIw6%;>p7%LWeVM|af^wko|(s`bvJK$m6 z?_PgjL$}?3t5f`U`Fx!85pAk0A5Mqf94pdLtz&Jns}SngXfeQLDN$mAtQYY=vE#-5 z(aFCpY`~}CI)v_U4)+ zD@ezcw=tx+G@99g6J=X!)wa^o+LUdOV~TLHTlLs+gZX~j(xy$0_R@PKw;@jK?LvD{ z((ePvoBM-EKd8c*z)c83X%Gt{U29f9w;Al|RbHUlXOxm|^v>x`GHf_>5_HAzOmN6f z8r4)G1)7Bl+w0A3w(;ak8*TgNFQ@yoKdY8L{;Tu-#b4#!p2vVaz!9`UtSn`%vRh<8 zU?4D-s;a82mK6&aM%WH?xiuYw*)#$-P6-WCMi~JpAxdePnP(B<=X92F5z`80VkOy_uSx-JAW7i4Ri!-pu(Hgb! zW)aq9${OLa%!3M)$V)YoV!7B>wgTq06HP6+tXS$62xcNhfa;|&K@eF|8e>;J#>Y5k z0-2iy65LxdLqTI~ZxVvQ$~m;MJbF3(w`h`fV4&mK^aS8@#A7mA)ZKglS+9!>$Tu4jIG-1<4vAm zrZ#S=3XIVrqfLp~Hy$CyirsvW_YjDOKn<7Xn!3tll`2AQ`aWDo!{qEY>E}ss%lVJhSX7vXOvo;O=;cSP2A~jfOELaX0ThbxKXrdGL+xF zxbmg3+0F{?hVALO=Xu@RyYKvf00000_2;*F)zn{YHPc9lG32)V@#BS9GmI>?K>8(N z&ThDL_0{Q+MMqNT*)Xf%p_$LaLoqeswCme-B5(k#d5`!B!8o_xNOx6A+l z0DOENcmeR>000d=dOnNe<$QhJ>*~9%OMIur758QXSi&vM8}d7LTXf9AlzASlt{nHL$?o*B$`^r7hxd4@1+l;lsZC zX|)A*#oI~RCmO1+&h^tyDy1jH;y^L12xADMb|d7W(99r=QA4{=sfQWcCj*~g%I2?Sp4+p8rzf!9cMiDQtt_-n)#1hJsEy3Xw}&*xeNLV60*Te%T%|O3)^krkLz{-OVV@p!E08iiB!Fo0ic&x#g`;TO zX+p^)Crw5Rn`saVmWZ}6WtzKg?P8z+0000000000EdT{-fB*mh007Vc4MDNn+ip$g znsHJic(#(PrgCJlN)`nmPzo$7jdhl6Q`eUW6`~O>OA^ir8aH|N{Zdoi?!66c00000 z000000RRD@001BWAOOHX0000000000Q~&@#3O2=EUtiPTFI%nBg!(0C!IU3`m5JAq z%OJ}El&b8WA3b%|IlS6h zp^q@fB9GB-5kp(gV}qI^v5X~3z?C6q0U!m|3m`38S{5SfsMl&#MKcxCa=FWqwlx%r zb*q=1x|!#01SQZ5LNhT+3W`xEjD;ygqY5mFMS=9zNMJxIz&t!8N(xfZ8&!n1o#D`$ zkfrs-!pT7Cfo5p3RtgkQS878-6+>$?GXj+$j|8&oQEW(sLdzvUTLR?~om;IQH49Kr*ZjZKcmCz7z5{pR z%rErvA+8#!0+gPLuz!%VziyxkPqo)V3DY%YTzx^~&q5C;rg527h%Ki4Ei^Bs)Ep z;U0Hcc0!vJ#$Kf5hU7u1a-BqWABlRQUApd$qPgM-QkrHG{Yj=$DWCocoiE~ke$1pT*WS1D ze%IY$+HWc^yXmKgTSpP={ElK~JK9X)ntV*@n~-0eS~KRID|5d6GD9BJ0$zkc0GQGv z5MPZ7C!cE#@V||~h8nN0o%>G^!W-qw`#dLtpNV8%-r^I5rcV@nePff?P27_+{BY}P zr)e;XA2t|;9r9!}ozn154w$;=(-fGD5cY`ctmN#ON^1lbLCb0iB7c9lWIuM#gbYeC zXI1g}@+=7vsAZO@^N$~zVJN2_&kLEB#Xa8T6d~}a{=kwF`W!o29 zp${m8XH?=wY6qSXBm3z;{Qj>ZPTi^k9S*$lgg?Dh+?U($s`{&Wi{;_V=+AW#b#0pC zYcfsHvdsVbDPWVj7rolml4uERSLm^%mEIjeZqSrJcxO@eye!wWe@bV;Xp23R-Yn7e0`wp*_^1y z=Yo!BhnckKS{9qMn=^3UsOA~dQ@6kO?ghE_=f)M)|KYFS=~I@9DvhKWU4;;urY{0- z{3nHJhqzjM7Wx9!tBVx9fF4oV9CHmjPo4`D3S^-7{xBlviH`e=2M zwOTXb_H$~T^ypF{x%hn%mr5{B4u1MIbMKuJetqc)U(@~{my!GN53Xp@1}KjYJ0mc_ z$Sz(zSJNkSJXz|#4=uGG+2ur16eleF8gfs;9}lD1@%pzldFRNwPm~!1S#RrJBr8tF z3BMMv$K^5$Hldc0%5=pheiM+lSY(c!4RiTumi=3}1S7I5`<GJogqX{@4!Q8np>lz-6 z&O0npL}c+_>YcSdq!XLkfQ4wSB?LG8!~R&Ezt_ROB=?c_IRBX}an#p}WA~GuJo)j` z^>wCvUx#*o!>iS_Wo3V}Jw9^(r!F^8Ouj8!hLM)y1R(<<+}~2e;Wwsh|0#Lq z)c$1^CW_;w>j%OVQPJcC|$xBOB z?hSm5rzuxjEw;8I-Zo;1S&mteRAQ>AfV`y)fkjk>IR2l7ICbP)Yj36L3KjV68kKDD z_orruN|h_8i;I|gT<_|=uXY__NpcyBAy3D`aPl^IU<*<#7t_SZysvO5~gy<4l(556pQFGrX z_IhA))h8!h4{Ut)^5(g@TqXF5M7&b7LYT zpy$mFmly4=rwJT3>53rvBhHIeEUL``GUs&)Jsh+ii~eMHo5d%s4s^bbb^0fzi(~dp z>5|9qUYI}ZLvom0K13ouLPT6N3&%XelUTAcKP42W?f#Gd7GfLl+xV`YQ%QLt&lpJ` z%?`>vY=azh%AN68?wtGOs-+v2$&@ec59l4NS@VC-GafZDKjQrSRnaMu;DDT_sdG;3 zD*X9eSKwb5q6i|7o3&9>C!SI=;D!7@XQW8DbCiB!Nw2fv#ui=FG$x*%)w&W<)ch6O zg*lPT$4?{{;U8P#NdjX?bRa-dtWZFW4vSrzKTC2J;C?oKq^ioiYI@w01t#tA@J3D4 zLbT{1+)R%NuGfMGNYeaE>DM}v{Et1)MqY{^drzZ31B0su+S0sC#qoX1@jqT1YV?Ug z0yb(7RWQHo!_`*z(o54`)9O@2*gmK=G9UQfyC1Ik=18HQlqz5lSU#vq4mu??QRI%) z|6d3AYJb5xo8(A|e?!s9i7E;AMn_A8kHrFA5%A%oncu3{xpLOT1BnoG3|)w<+#)jv zghB^g#HAk_*!;^Z1nhe_>;1FdCb#uEeUG~Y->m8gz;_!u3M4mK z)Ome9v5`Yt<{BVmi4%4W=Vznw_cx=gP0QNnHyFOwnLuS(`??;K9EgHqkIRG$aDTe- z@B8x5qRb^4D}%s)8Eum&|J@tEvrA`05cs<|@?X9d=Xcmsnu|hpn459I%#KcS2tro%4!OYS7+VndO_e<8EMT=+u?15!t zVz(h7B$CNRH&kV0D;_fZN6wk1kFgYNbb=*M6|oUP%EIJRf1{EO{~qc8M06KR#A8&nqd!;*sJAuIsXk`$`hGP9rGCp-#H1AQob2S`?SuAlhHUku6XBC zif7aOBTYELri*pFrtVD6n@#bkKE%w=?`L{H=JfWXbB0&%h z6HQ!lho4O_bYL%PC_%m7wx)2PLcN@mhBd+wVaeM7NW;#)dq!?q+JA3Lb2+^(f2Q-4 zc`sI};NJOH`>SbH=K8M0_TXhXdel0+%R{)3ovFi-|NERnr5{@kkE3Y>HlXu^Kn-0aaq?|N-Wk64pus3!?WPu zxi2$`?s&z4*=)mSRdg!P=Lc5De_0|!|1&SI_LTCkkse-&_HxhlGx3S@3IXss%HYSswA< z@)q=x96}gNzw$|z;M9bb{z!7CPUo2?NOk`gSU%QydU@Q|%sRGRY_G}m>YP8G&&#VR zsYSbvIzqNi4&^VpC-ZS~&40~qAvf|v$|d*Ku?+O1gwuoDH{kp*1}7Lger+sT7fJx3 zF$4>yaA4Aag#-8|?%d%Zl4RgKcEDPm5MGx{@1FV4?Ka`#*nRms_N4aBs3hRj@t=Q; z-VdHKh*Fc3WC4)nmr242Y_U~Doqn(WG{M9LkJ8k9T>r1_{y2K`2EK1!$L?9}R;@Fn zr>TK`??P2c4HTgt9=G)PJ5m33XQ6x5L|vUQgsJ)|i4xl?i783*Fw~S(K4;{!_`gZN z)5srlbaO=bAev^EIsD(L-X(4i zeE}s1rq?{gA`$$(e+jY8w~Hx`LEo$E^l!ItOO060b+cG=9U+QRn4~TuA^txKnnI*Z zJTJ_?nR(O0Q{I#?C#~vWqAXiw4v?`rB&nU56jZW31po9N##VQ-WPCncV->O5*%<0E z8MWOopu>}X&A{_YpCZ_H6gyP4EZEC6m-_lTep7_qdBsG1k(8m&0LJFXVGd#fRer1i zK72m8*==dL-%wr`wp}@E^|_N1$mO)XQ>dDfTIb#!O}kqtWFa2a8(UulhBp=mtiuVl zL}5z%EalV3W!sAac0fQ&bCGUL2uEZOZZXVPXecB|>N0g}b&F6uA(8P(TAg=MXDTNd z+5*6FP*_X#>-cOAynfR>9IT=;K`uS>9Lt@v=ps_I7$xZ~0_^QD?j(@&UrRz%DpnJk z>KO&f+fhLjX0<`K`n5!Gl_Sd(^k-*1S&x;LFjxub!?&}Zbt~-k8N*l=^nFmx@OpfD z^zO%>ALGXeK80-*g4=*;efKvFEw#vc(RKZ&Z5zh*-1}Pjh}BuSbarAA8Jl z$Ac8!Ps-Rk$#c<8YK(I|YgV{Sjg8VEGo!D681kTkxN+G*(n4hyVZ;bdj(H8%YHp`^ zJ!I&vO;RHQ8VEX0?P1tK#ScP<2!~Yqk4wMPbc{o!!@HGF2N7F#D1;=5GfhIP7s2($ z&FMbRzf<$}|8|$D3eN|5&>4er&f-(LTHKx`XgIPc8Zksv+veTreXDcZMepAmpD#NP zDxW04!4XA}=~8@|MBTFeErhRh!NOq)qi)nAY7C8+CdU zuD`vemzdhw@8=m67oilaqdX~F<>4#p-#kOB$?%w^jGihBr<8s)6$pBvt_VYEF-X!l zAE!3@eRnPLyRMcrZ;h8i<-o{zw2N326x2hj=!D*#Y^)55EEmv;=$u2!SGDw_`5rvs zKt_+9v@Ar=6L^B;b%) z6a@mXD$`9PO3;c>r7262(;^r7ES%z5c}0M*Ss_}52(o%&yrqQWw6DjXzVe-DC@;GPgeN)u* zv&FT(w%w{^ZO(d5mrKE+8#U?w8(l*dFr;qG`3@d;*^%_x&nu{*O2H2*^~c~4%8{{JUtPJKXppSJXV zSI0#I#X2*rScX;iXVmRlO`r?$jB(D&3QvwR|WW-=n?RO+<5*Jec?aNTep;{3ZEMs);Bt2}$VDJKv_ zomv$}8JRPISlhKdL9AKFiiPwjbsU_BMT3xSa;0*L~82}#baVc=$RdB3%&cgzD)pMv$&l)C1^u7 zB44~|S#MVS@`mvD(MAd2ZKXz~5LISErn?ra3($WjH%#|Kv`uf)=jq>1l;()2#am)C z*PJ_g=TjVS#oV00&Z+LYbF20@#FXr)mb5-wor1yUfm6y9LG7U0dBymjS-m$qUbwkhks6G&02kI{@-6e$K5Q>QxEPrj;j7vU+|s=y4@t17^_l5Qv<{A zgUQObMijLm6Gz&r-1ExWz`=es!r`iv7(MI|xd_Hm`Th4p>0@hELWV5l8Q3#^#9}4O z_~QU3kfpsw4%CRnip65L{U27Fw1cEp+?{;m~Uy}VK4!ek@}7hb49y3OBC-qNbQ-X55!%l7`uq`u5#wl&vd zSML10^A!~p6%`eVii(QGMMXxprKJiIvoJ#M=ci7;qehXIktAd3(7T9)KgusFqcF}f z;R<`ZIdat4G;#0ecgviv4z8x80cvEJS|y%~w|YCW)#0BUbJv41SD~4Y7LtXerB5`Y zi09?^8jr_^O3}fjF{=b;y2vU``m|@V&&@dQ!-G8H$#?HAK#NGp(l9n5j;T~`%T*8{c{(o%8UPcJKy`i z?bq%mn?m_ANM=bR=la449+ky60A^s(nPvRMK|W;somBi*tmzMzdli|1Q65_Wbqywz zH*Ou6we%vf^`|aS;}p*63FwG<{_)x{agRrF0~Z}1Qi^J(Yw8FP2vJp>nn}?cs)^IJ z5GrtZb*BgqXC0}*BaVMe^8%nJG5!ZMQr2;3sRo8~~6&Z@-&fYpYR8ls z{s|b`G*j)}(CQHEu6`2rYlm<}yAF_(G70p!g=4e1S2QT9p%hh9r>jiC8U?;WzPt&f zUnh?-;%O)~b2*}(As}auFg#_X(Q@XK%dXT__c!h<(`_0Q$_;}f8pc%UV*N@}7H z{j43DL<3h0_K{8}PHHJn)TuNM-6rSGDmQ|?|BOR5N(+qr`PP+ zT@(c_EQaEP__A-yFHeWBC$AERgTiCNk^cGL3`j^p%(;20+KSe_QvR>QL$u;3k?pY` zG6{TAiXKRm8Tj_o;4;Uv!Don_^tBZSy93{cEq`s<5A`2<9t6oG32|RoNu(q|#j9E8 zdZz^9Qz2um4i>_t-xT<9;zT$kl%3fWn{Y4Lw|~A6mmk&-dy#Rj2D#b6ggM!nL!MWZ z>7_V?SIVZY8OZqjXL9wB?3)4KBzA9?^|%tZnJd*$kc8?W9SG~vI2yZKiyUzn?a6bR9hf#ZM-D@S0j!(bg!T{=nj5%a zhfW13-+eR_D1HUCYlA*|(uT;Fx`ICHg~%m^qjr3*g; zM1mN6L``j;QW}TJaFLP(3fx@36SWjOrI_#%n6!BA+#Thb0|yYsp5co_OmnO658T%= zvw6e_V;#F@G;sckL`nu+ymaPJ@Z;6wlaBIn(1Hmjo4WWlXdC4+5hTO}7Vb42di#1G z%zha=6MecAo0_^;fv(;=8ZPGS0d<< zzu$8P!;xKcb(Jh7*XP4~7*F+z%%__t9Sbim90<5~Vxe*%i+Jng*s1+f9|$ znchg8A`mF-Axti4XJ51UzUXrNxVpUSsk|p;HxW3;5n(8PgDjj>-z&-8u|)&n{B|Ck zOFcAc3uzz~1W!ouAu0u6CxALDak(R|Lcbl zr&ewzUr^o?v`GtOAH^)}X*ty_WnT71dpmgVzM00(TfySiA7(FKEO@u%;T+ho@{127 z@N8iYBq?Z-yc)Ek(!LX;l9!$KfL?CAUQQ|EM^|0u_u1HyV(gliJ~-TsmBCE(&k7-` zf4`b{$yic7rAd%pIf=;7eh_6>!DmkFr@phtDxMOn#)BB~wjUoHIn}?DyMy~uqJZ>R z3b2YSDoT>)E@xHEtc^=6n_{gM(O@i6Ab{7sFwTw$kD^dUaYb~!L3`|1(>J+$mb#av zMeokm-MP0cfnvC6+qR9J+UbmBlVf7t*6VWRcYBCr?YSPya5tJbBoeb6q(cZX6qu7~ zGVRul%HMew`kHl6(3?Yqsar^9y*y=Xh10qUInF>tM1?I(hbp`dh6f#(2J>iih>o>G zHImLcR_u~cdQlR4R)}3A`z$(eoO;i;%K5wue>!+)vwgla#23{i9)X92AC;>GhYL!2 z*g~+L4p@11o6>i!D5*ruNh3i6vq}7&6=SANm<$gOkDff{MiDmGvHH@j*3DY**kCjf%mt?|Z%s#r7u{P-p ze1ttsOFWuFCSXW1piuD&U`q>i`x(r>|EkR^8Qser+)4Iv^mWPpmc5McN?{1^Te#L( zA?KTB62m4KXmXhm1&X}89;g*K&LSqH&Y8ZZ^X88KhKy-+z~x?`p&bs9M zFv5ZaLp?atFCsOnA&`dBCMHbCCL|_F5O+cqQkeZdP|xP?%l4vG6@o%bvT-vBx=D0* zmi0yYCtjC?%)Bx&IEQ^l++a8`%B&?+?Dd(6+t)WoH$7tM?Mea|hxj8T(E&;p(n$zO zZrlY#C`yTkj;MGJ5BDSg`NDS-l4tf=&y4S`N5!J*31)qsPJ-4TyeZYm^)$+d3r7kore}u5kUKoM?jO5g zlL_jF9SQat*OyP%u%hp_>X=DYMnRQePCdVGc3Wg*ms|I|hsuXxN4% z-np1WP1zan?rAigmMRn=#FNrLr{z%GHiH;RJQ|e0PZ|TicQ5$kr;CzykG!!ag z8KD-OcPM?OJ{~-2FP?5Mo~bChm4;-t%m{|K#aRARZl2DLV&3fInYnJp_xXgKN?{3| zdLx`wL`N!)R);m*eSeeOt8zG_(+r~syiWa`V4f%-c20;~D5rL9NTxK;rq6nhSA1n@ zN~TnQ2#(bw-%TBOq&xNyvg(*BV1opZ;D;}%q5SaH94Mn)SF^;y)oeIc~iv8 zRDh$G^&hYe@2Y8`br}Ivv<(df2}KPJA-8wwzAxSQIiF>3Rb07aLhk>E z^YLylg2&T+Wyz5gcK+j?1%I?UL3nECV!YI-;=GS#s>UJJNLkf*+FU{|is(L>3lwWXYkX@v3J<_O3kd-?p(ut@n zmlCv(V_&t{+f!Ec*JC+-M$`QgzkZ|Qzg7HK;=YgG8l_eFd!qmW1QCL3TKfKa`ThUy z-gvyrk_AL-7=Xq3HVHT(POU{z9<3FM`FQSsmz(+epW5X=A@XJ3P5p0_{-d27sIsT= z;>C}O3tGt*AH0EaY0Cqn{QYl#NBWCVDn5B4!09J79cx|u9lcK}21P*yV_2e9@pmP5 z-yB-z-8DJI-?o5ZgRLxU%}(jTnkyj1P8cX;j;6cxUN~notB^A_4>9`&(SlI^#li$W zehOj^QOX_Ws$@}E!a+~e{?5(%_Ta~zU@ox3?aL|{M%bt8{x`pbfkGcuInmRvUkjbf zzj_^hIXL|>ljy7vrR76*eF9sUP~=pP`KCKn^1jr5|7})`TxYj`hN`~2?KInNoZ3A3 z*AS;d?fBe|&LqW8F}40w&fc5IoPMIGy%MDYUDMZp;k>+mjz1Lp&i@{gUvHY?w)=h4 zp?Y3tm6?y_<{od_Iu%?*NBQQXR_af=+{%xsc1;vcGXt+V2>*0F=a=PVn)34x?@r3~ zPZGXPPid__?xUD7CFJG#y~Cm-QG!Y}@0X6;K1y`j?ElEAV^iAgPwjIr(xqs0unnh0 z%sTbw^=fyS_U@#o{>g}(&q)jHxr|YHaXzT|UPW;oZivs<&2I0?{fZL(i}|6;d~!QG zi~Z3>RC2pi(l(-o{Bh%toN6D})%#ZA+yXGGy<1jKIsR_<2zZ#)T zYGZHnsr-)emGW}?=GENDzKDFD*+xl__J>5e%y4r`nrG54o@uv_eDCpZlbghgXQB}~ zAA<3xI9%p_-TmHr*86i0p0@I;rO6}h?Fk)~mvOy1pQTrU>))u3ZZu3oit?}N$i_T# z`k?uExEIcEjpx1*K974GSn~)(^JaMa^*O!2lz&{E)O@l3P@Qk(+qaJubPd@#1CGDM zRwHumo*w0{z6vY0=&RxHf3iMVy|v1Uy>?q_lgZ~^r=l~3pE$vBTA_y4q2%>O0`zX= zruks7S~;Ux@={A<>_PEbbLYN^R|o9S{c-Ap_t9h{pItJGX62jgfPV8WD4!gvS%?h4 z1t3x-Djlw30YfkeLPP~9s3>@U&{&WRWl`)f#pxg$GKbni?IHQBO^EL_I*<)T3os}@ zTJ1=Kh~tF{QcR=-dwr#T1nU_dy(?gVatfg1{uNO-k0?2+P?boR8iKe&u1F;go>i|}(y2;d8bm4x7=j;ETYwwP-XYRjP%=Z^86^u#5)`E%a)8)?dO@)PJ{Bz? zCs|dYXy@+7ES1;-AIE0}fSwqbu2?|#Y#6#IgrF!Y{8{)QP6-NoiPZc*lR5KpNT?(9 zUj~JFnlcI(#}mzU!qnOz{gD$9aRt8%E_#Ta?X?t(Wov!Ki9|A}Vb=7{pwdrk4&{(9RIuQ7eDVSD96)+w!B4Sf?;?{*q3Kb|8 zhNwj?u?(o5%mX@@jX(&WWp#{&_LpKOvL#M11V6ZnEyU*)`(aTB#GAt>4B2OX}S=SOXr z1yWFqlzPB?(jt72ZVVwRsDgDTvw;dWJQ-;M-zo3%lNr{sZHudMCNT8ha1Z0SgK{>5 zKe@wMfQO=^(@_)BPGfniNWkQau6!;Iw81 z)Hvy{P6$YJIvxI>WKL^-&00LuYOA+muzO)m4$(0>E8iwkkf-FXAvB)u><)YYo+K>K z#BibhXzY%40e@BpGSt#Z_%RG3sr;FRbOY{t6mfs@3^G}jkcvWo$@6%D`Xu!qiuM_m z;AW2kWE=Dp<~yl~T;=R@9fNAOt>7|WQf6%kmuuhTVKE&;09`BdRR*;{5Q2mt5#94g zhN`L}x&do$qJFKgb>NgX;~nY_m~MD%{)_o9$9$l5>sL(5Dxxj2&^@R0-HjvSXh+LsBAY zeh@fw@EkCjiykXgR23MbNwhlgMiTt-_4;=-(4{S!p@4?;KOPx_5<)QHcw7a770gnw zLafF!t~Au{C`9LZ&38wxsCk>x4LD7%iN% z8Ae77mrN0|=CnpKC5;h`Eew%8_XCq-8WxIig1m{M2@*_(gkl~%QXz@@W(ea5IzDG* z!4|OVjWr(5~I`ueU%smryc37&Oj~7LyO3O=5 zF$!Zhl%Y;@oQ1R+PXAfsKt8)pm@21&*cBlxl&RoD42%k3w2c~B5i-<7v_PcPH7Ms> zZIfaBB2IFN=U{ofNY7aStwAA@Ec~I%NScF2V}ZrrrTxf(Js5Y_;O-w(Kzmr$p+AKd?)?RILd!vyF^ZXe!s)z<-U_a z_SH#Tv?#iA35W?gDBER^tLS#=jsNbq>h5pXkD}ci*Z1ww$-?tnMA+lNcM~9F2tcOp zA+|JEU={?mwkO4|v?A6ey&GbZveG)xsbG;8Hc}KSAz^Bk+C-`{l|B08IoCwCjnYJu z6U#P2SeBHdc;hP4+G=HH3#QSTD9CMtS6Umv!2H_A9Vyq}W}hxY`G~a^+ILe)Xp0%q zqCdJMjdM0P1H*ehX7q9=dN_%A8Gm=%58>)vY1bUc)3(&32N07q2Lx;f)P_MiQ3iBg zwi4VH<4dVcawXKaVT-7mQ%W~nCdIfe+hF|I$YPukEUZIY6KkRPhR=t6&&|=`J4z}E z!4dUj#7qd5iOcA1$>THxrFE8YBPxyV${Re!iZzf>bK7sTfkvR{%Z`)99652zVl)hs zvm@C6qPn*9QyXCO~Kg&~*nC|q=pd{fD zbH#?%jR1V4UTbj_#-W9CB76%e}X% zn*?KFe$yl&3A~UxCd6QxKNXzYzq^skS(uODanN>4{rF>}7Caz38HKGoCV+!85Xys) zy_=|*6WgCh&twZFt34&}fFa<7Bw$1n#mJC>2)Pz`j)c~+4n>>3r2u* zCo{@NgioW>R^eI( z&^4_sqrA0#l1G6s&8Yklw>I)G<=T7+!r0lqOkTmD6r1B0A&Co<_)k&#O0@EisDH?S zf3X0#5*zB!eUR`K>9`B}yAErF0x{JwkDY|&r1}T^R>kqhWj<7DVg)dRCLE)LT2XM7 zP)$WM3{p$_=!9n&#Lcr$^R6C`V$sRV^+9Nn=c^hyp#${J=0D&0ttdFVmT zNMw>pB$7!003?!0M3YvNCJIR;l1U_zNhFdj0unjamY5%25{4MVaKe>7 zsY)4GB`RAiD+MFsb<7g(h+zii+-SIEGr@H_cFBzd(iu>OunHj^C@iEUSs3J))JZhK zDO_Tdv=T72C|raz1!6N(7~(fI5(T7v1Ju_s1Lmpf|8jA;coHA&7OIhstbL z(rAwOe*#QEtU?xJ*MaB#BqFd%g7lOq5`Z=P|JUr_Z+>4mG{DoD)ertiQfKeAm>o5V zhd^T*{qQJlK5TpWy$YylimIxIw>x?IyLaE8^J`ul@JB@`5r&bm>i;L~l5Hj2?+|zU zTXJ&UF1tAd4m;%z-p}Ek@@pXyFp_Of(&f(%G`aR3qo^OW0}KaZ7?fCwS-%g5^YOlQ zIM&8I68{(+x*HaG_*cwJAa_sYnZ%f}+AaVY$Qpgb-~M}#vu=AL2ahPAWKq9Q1WpYhs$!6D{Afuy8Zsdk?keu*Mm1LghR zUk^U~=x6m~Tdv*fMKUg zyV7|G?x64YI~6d5T;r5&_6?}SAcrQwn8>9GV~#k{JcnW&zA%wcs+?g!>=Bt1!c2K= z;#kmww9nfgYrC5b;DkT7fyf$rgzaI(V|r{9TUv1G0ekzDS&HJquqllb5+7#@rMma> zpfW_nhVV?t1j9GiC6Ni{`0@Kz7q0D!80s(heJW$Ym-sZ}kge@GSMN8Y2ER3a%PR=v zs7XKtbD^X^2m#tc2yn(@hCIUqOiqSyezE}FffO-ZjrJyodDQydEmfBlwmfLKFCy4_5eq@sTvHZ;#W(oVY5~J+hPb`O`6@_Zs1Vp0J z+a-)5lxui=F<|)L>cRRtXW1T(Mqek*oup~`XA^Mp~O4T zJR7ptY6W-)sp>WDfD^GNFRPYjYk!}Z!1BUYLolD5Jbyq5r07Z2p-UP8Wuav5)Y7%I zt=#TxyRKIf>1&sFW1-Vwb{6VXqERX}ER!C`4gRIHW5B&ZpX zqER83u$hzL&s<4Rxo3uj@^HkZ*fhSmY*6XYS-5U~-#;H%eFPNj0SzDJ5HAxXF|^w3 z1&D3A(WHP?T?B^qS8OzW)tofG5RyTvqz;7g?{4ek{JwKknYva9p8H_x0yZYGO|_Px z$AZP!GLyDQ1R3nXhk}#pme>-{I zCjO@RW1$6mC$<|+4s`S86bDRF`dDPc`o#!{Wptqn$Xe_5`?kvF1Lc5uU>Oz?vswmZ zCK(aV5nx%WqPc=F%LY~yRt9Tqr8P0ABbcE?iVQ-bm@0`TOp_ramBH7?=u2-mjon|> ze^q-o*j5hOeE&A?&_*3;c{jRnj9N34T*9Dl&WJgjLKpv%{fVB{^hG9bekma=R2ss+ zx1+-bXNNpOi9k#^YD@0CXpm>t$P-rf1%)EeX@7`PMBH%YbIc5ZkJ#w*vD|~a>Um2) zP`{Urt}2n%{_dxNo}>+bNk+S2w}*KD9lQd9L;81cJ&tMa4QKW$b)et!dY6(YPsk)Y z`Ey5<4*$G1I0%VRPh@m3(b6jjDvwrf9d-^e?1-q3&J(RylLlH>=ML=eu+-6|4GeRI?)V1=Na?EZZuak8g@$5j1sBxf+nEOqq z>|bQRS8+x#DC8{2Ia%O8Gn3hw*t=ODnA|iXC@GMOI75~sV7DPZ>VLcbBnFy(`ihoM z!5V2BXqd%-i#W^(0b*t<5QB5RZ4>PMmcJ1xZmJSQ~Xg^ zF&s;lO+u02p}_vqJ6V-t5R%R&>Cb!uiH<=PAtNCL!U$vUd#I}wK!8O;3~76glA6>V z&&%&A`b2Kepo7xPE8Ki;fIIF<27qA}RL^q=Wfbn3jymSbXTOUg^jh68Yy0F7j~ za11iyJs9&vp)>=#39K+ILWow7&{8UDUHj)V1hhPRqP7vh-M&C zC`hqD_4DJe$+7AT201i9dS)J}N-Bi@h%l&o2t&a0`m_fGs~0$4*ahTk1HMqmh)sxM zp;^zZB$DKf=qLV#xu z6!Z}%(Qhs+zgLEmOFzL&G%_a0DvLEeZ*?~bDn7nA+H0N=zE3$F)6wjcu_b>_|>gJ z%x;%e0rWjH76$4*XwjUq?}=vYLOsNA+#WkV15=k)?t&o0eJ9$?Tm@BTu`m2I2j1<8DhrYDvem%wx zv0L>V|RWdBM21KZ0WW&zaL zv=075c@;1bLWp}#YiMl~$mGsul(VILpw>N^VDASX$V40c;u2hchv!RS*D1E}a;vK#oHix9| zrqJTY_fkJX5@&uP`jmZweuC2DINgqIQ8C#%ve7mkDEQN!Qd0}?w$Qwd60x@l?Y;v_>V~T z6C_sKHtR{=L*v1z-$uy<_PnyOY-9nJCN`82?Io82lNySk<`09RH&M;Xf2eO|K zMd4$zu>;;BGzVxvc5QuQvN9hjH5Y#$hr2rJdyTsLO!gYDk8(ia{e;n z#9%{ER1|+KjR_rVkZm?8EY@pEw4hybG(TU)z`A{D(8UF24kXHep!^$sJ-deSR4Ko+ z^FKcwf^s_1K9n$USfHvc{r#r6B7Jx{Bp&uYARxvxmfKdA+fbuzs9S1ZBn$}w7!MOj zAoF1f2PD*>*4ElKy4@JCzcXyCc%{^~+L=h^g&4yDy)_HX<$w&5XBl&RxGfjp;3xiOk&h7x=|^^-<#Nh)e|z_*Azp2;lo1- z!V$M!x`BDen8uWsYG+y@ElHg`Q*h^goph@BAax97?%PY7i&o;7{ruPkLxmzXlAlTy zdChj|ybrgayhD~c>vr1?hr#Y;%kB`Ue`8*yD#!{Xw$g<~5IVD?+4viOebs=WO znCfJ*)@J+DW0~>(&L$_#_N8|dvIl_&<32117Jnj9@b$PZ?yTeGMaB?<4gYJ=N;wef z6#oslAuZ#^UDM41rT7Wk%G%YT_~oWAMH%Vl;r;4#wh31%*@YZkJ3gNm5ZDl0Hw-&D z=HWqv5qO~A9ecL!mFZPYkqE*B2s&rIIRxm%+>}&fd1+zwq0gV|-9+@h5^o7b!z~yv zcfEnvFF=QM-dX8sU%2J_ap2ynk5(d!GSn8GR+LQM;OSfyxSA58EJ0(K>(*q56hWsp zk`hvOgb5T*L>Y(;F55Y`U#^ey{QG^qzK^S~qPJ{IHtCLvXrgcK{r}3#CvA2?Cb6B` zORh4LMG$vR>D);QMV7)>uL?9!RYgz3b}vP_xIJ;5CH7wK>h10hf1GWMVEzv2Lf@1K zpiv&@%lcgzlK(;qyCqh7U|GN9n!#qksJs8vjxi|Iw?N0{s3lh?pJ(ox-NW*Fn5)tH zN1vip(9CR2seS+Sdw9L8=8jGn-4hjTKeh>NB1T-#2t2>FZ=ct*qxGu2kkPVt6aUMf zM;vAU?{qy_pZI_0|6lyu&Gp%kAFAg8N>DuL(}F}h&`#Ss)H~ssyEj2=A*rSKjG;ADAN3E zwoZKcf)MRz?-$ zqTcfQY_i+46|S#c&@C%0SYa79D;;;?5U&k!j1oyJl1miWMi66>K}1fJoQfg-e*RvV zm22%oTJFVGiR}}(@n2dEY6vGq1u9w_D)mm9t*yJd6(Qf*reSiXcu{ylAUpjYzuoKo zp82iz=1KT`BdntR`~F{DF(NP3*H5peXpt*UQhppz;Q|(V{Ww|4mo*=q)>w0Bp&|7f zP>HNwoT}=^a+^JSj)))f&#qT*o$nkTR5*U!li5<{%R^Oe-%IrCm3*(7A0yqjIo^!t z$9#EAE8C{nQ7-O0(TdkrGx6DG)#-m5_-xJ7qg)~3k5sdOuqx*3eVEUOZieJ)4N|SR zk$)W~_Qs2TpJnCQsJ7F!IvPtY-aP_*%LUezip%sq&!hByPlw&>cX9Upv{hAA6?-KAV?4-%_Kms z_+>Zey2g zzwj+5{u1DnPs=Vjnlk%+9;F5{JG1kusI&3+{5faz_3*E6eb&M$Q+9tX-$e&JrfCrO zcY3(<@h~ReH}&+Zd9_Razb=2h&j?R-8E(rO?moHz?_MRlX(6A>SFbU<%J*Dv*{18e ztJ7YaIebo{66f~{-i1o>OLCb;GUb-&#Av#6BBCLEbq&UAvuk_Op02-tZ5sG>_f!1( zRTONN5p!qX^?1hg+02nOR?DBatLq;x>z^A>3-|A>k8cFRzdF)epwW`YE~|56RO< zu%XI1(U&Vcda6-h*O~M|P!MFg?v`l0zs?VV{tzi}At{cm|tqpsbDIp~3YxFxebtseJYhk_CkCT?Ug9L%W8Lao<1ZvYN+h zzO%H+zl71@rrga&$Q|-KwSGq$OH?=fz~vZhJc30EyNvXnaB$8ny0003Y>Fdvxd0#2M?_It=j~mh$^o70ZYsyFx06 z41wtDlLr4c8+E94yz5eT;s4#-_w^Lr>9fO*w0<7&)t?VKea3`@1SEJFMIr#McCYiw-Vf(@4m#<_cQQ&l5qD%w2xoEZsHP-YwOvFDn1X8fBkDvQ z2Tcgm0bg$jnut(ZMT9euF(Stf@-S0~iL@ENBbcVF)aChJeLU%z|G}V-=C4AEU+$N> zGG8lD|1HtEc(iG0u5MAO+&Y_i*5*e>TDjG%%Z=^oYg^SlRi-Z-S-X3RA6FYfdU(fl zgtfQLxxH^&qjLt5Q%|_X5e~B{DR@;g4@zD2F6|CNDPoJ5-l_?yjUa?#RQXCbB+SGu z4|y|ALyrl{dPcWZG@yr!NhVu}0-B{I5>dIirM*mE-mg$zwOh+A^3}y@O0*;t^ps{) z$)#e8dZ!+;2w`PBqPCN|BGlsCn#_&H=V-01fT3jM!{UVxN@3w+m8yz|b6E8eX;oq^ z6t1ddgcA1O{ncg9js4`{r zO~9mtVrf>E-lB4SHc%RP(qsv_?z`4z!}yR*|QLbV8_{Dw>~o^HB+FReE`nYF*iyj` zT>vjv>}rbxH3pgKf9?IjcPhS)bEBhL&$I68hL&LaN(fWDmRyJC?G9RMa~i(KZzzRm zE~Zy=@>?nj9T3Ecux&7e#2?76P^ZnH?$Br^+@0s&eRC@Ex-B6hU0H_0+jy?m%cq8w zjtL}{dAz9$aUP!g+~mTD#PXw(It*UPBTbH-Xsq)Az$q)MqocQ<(cM$mGh;F57+sN! zGem!XtLQlbq4>}I&)@=~`p?AuLWZGD84&bD5DE|=iizZX&qAKDA0P3j&%UK*Rx^`N zjPm2Z!l_nCh0+Yn4l^9M>=umi_W9hiCS>>UJfJpT5zH^W)aj$!-TtIRyh4h(#-98( zKWrH6(BE!8y|!0*Uz!bd#ljlN28)c|r0ElKlZEIoAd`tDSi}0wXZzB_!2h4mI!+_t zvd6kl4~|MbgKu~@nLL=$?OMQN9=KB?@rJ=f@o!)We9H=wbUn45y(dVk5+@m19WHUw zjfNvetW}y|K!Aaeqga^!DjQTqgXrFptW(fsWMl(cf}l3f5-Be*bJCci)7gi?4v^v_ z3P!hJD$1#~byLkp{CrU|lQXPv0|x$Ip6fjy&!(2uy6$df&>ZQqL#7$F!Od$j+ChL0 z0TUcOI%~`h4e9)8XZ}VAaopetf0kDv5+q9VKjY6SQLbXSxo&2a;u@KikQN*ne^K0o z@PY}#V+0BtYHHHbRM`~izjbePQzUze0+K^b5aYx%j@GE? z2UUK72t~m4Vu6SLG5lBW+ELt$88b;qNfJx}wFJ?kj>=<7DNX4FAHy1Itg5;Dtg33n zJ4(wRd_k{F%y~z(Xw>yHGiR}YKRs?)g-VDPLOwx*4QqKdT*(*PbH}Lx zEDoSZ6=S9r&#ujIR6Jn+rZH{9ORD{TjtFsu+oXh(5wre@W|V2bkMD!xVD`tyZU^9` z)F;DPl4rzY1}L!*MN#BW-<fzj`eD2P9J_|c73o9@4u;7SSj!`!~!ZhmQw$kXsc5{V#*y%L>=C^0P+5saoA zth3&f`i3fmutIoAogUAgT@%E-8R(Of4W!|)tT8MsPlHLRNH&4np^n+uIO{;MA<=$& z=5ieLh!nK;PcWc}2so)dI2tq__)cGgZZ=*83BJLYgY{`SM-Y>SY>)@8H*?kI_PSnG zBUr3SWTy9tfYK2VCrvv*j0K)=XWi%R&ywd{w)(;JdBfy4Nq}?gFJ_>y@N$Q*bwXQ{ zLEM1jL7*)>a!v_22s}hYvXvqAv6Ymz&9&+`&0H_WMnJeKSSw2jJQ85UU}om{n=()o zP<1o?Uc>EQU%KC@X&Otk42JF3SU>hdfBoQ7G&mann5T7w&`CkuTL|x>`cKCQTLI;= z*|7K5hXXcEYnVt=_xb%g*^+bM*E5t|PEL&(0SzGIxC1!r5a@tEv|wU5LE^QL65*Om zMAE>Z3i-bA(`}m9%g=#?BA&SM384izkjda^Rjz<&@WI~`C^^_H$@%BHFZTEC0Ev5r zfU~BUlDcd;``%#>eMQ$KO7Wt=p=6TVFkKZv>NAtO@V66Xz}CdPUyR8- zB>nnb$m*pU_R)mc_YupD!%_3IC4)>8m}qmlUM6gT0Iav4PMQd&IqBL2?@&XP#4Owk9|j4C7cqu1ELfg2UAaO{cR+rX3JjXkr_$<#;@&Bk@^2o#ZGod+9FC zlWrJHAQzxy&M<_ACs4ca?q~-boMYlRRGBEtqMs6sMD~ZobTCRaP)T0WX0B}KLCy}jn#c$?tHr|#pP zRM7WX2+I+aXopCKT*Tl)1~dtl9RKAkgdldrF!MN3kmg8X&>!~p|GFIHy~68^@npnX zJ9M65>Y#k`E_Fcs=MfOKF{N3vHC9N$7bua0D7>ZwBPn62=QsWcry0Ih-X0KxF&XRK!&#rp2()>IVg6N-YAU~kTg%CxFc-)#qPHni#3SZ3iTS{BiZ1lBa!6RU z?7^C?wi9U&rN@?S?!%~}Da4a^BB9%@WIwVdR_O5My|s&=rr!std&cue{O*%|SP_oB z7rP#=hL|||O{aUd@fn1(Rt7ooQwjHm0)tQ^!ewwg?4qD%(vZz&thyYK(7eW&RS)$P zqJ9b-o%)n_$dqd*yCEeB`7l62e;S832W zl5mFO$O$Nb%oDlWM}bb(F+uy-nEl9 z0KT5i9iSQIzu`DlPt`hJit{c~{Ry)oN!aHXDg=V*`p?_(Dk}t3Asv6X ztU^pC+DG^QFY_)DLLb&fm<0jOM9wo7S}@$HDcM$Dw%TzHCi3a}9kmL!={W!2ckQT& zIJyz(vG;`*G@Zn9~5O}oS&*WIsKy=&=sxe7TG|}?#?)<4{B%`T0Deww@U`*ytv~{I9KdC zsAXLh8vZlq+{y#2U5F-!sKdP1p%B|$`cd8wea>U;T&bX|7B)1R3j1oRn{{TSo5Nnp zuAqBL6LXuOM>aX4JxEn$7GqbW?{oX$bwl!mA<0qp)MwYpeEH3`f4hGtTw@r*FpOgl zJnP;1oxb1!zj0%HpGS3i8UPLW;KlWRU>Se_000000R9U8&iB1~{vPh`?>CTxySu%t z+Aig7Zjniw7NWEiw_8*b+jP2rk7?i8ZM(?PZvH~d!P9Koh^?9gR9aFTY%FiLfc7R4 zx!IkOQG4oZ*;;EmFr{BtUOIzLV&6n`6DZ4?TPCfdc4TSuO1dq%)pD)^j?F%9e#KWt zx33x=y*(T+xRLC#0)*V<*k=W2D2cyG53TX=tt_c;uoZ!WivUoapWp@@GkeSg) z+qGMJNrG@rPcV*Ea(F!(xEcFRyq(gh`#g@wnyQ>T zSV%wnCC%#$;4nosW z83T}zubKGWT&&sfqM^k73~YJt`FdHY4fshVB@`hJ&74Fal1W|xg_3LS=4i24HuK}_ z68OrM;%=0Wa3>>>VCJunFmLmQzsP`Bcq!q9vSyoj<$=ZV&i&!6X_UQMx> zW>NzOGd2{CXN?FlK_4@<*Eq#In9$gbYi2Mf=v^tamov}OKgkCgD119?E~!_^sO8eSucU?nYw3@ZsVF*(=3jbM-nZg+`_9fwqi zm!s0v<)r533#F)SRM`?iE+0-lv*W=;k?BWHnfe*>S4m~2Z&sUQD$8E?+OWQeC#Did zu^a`hl@>d1OR(inxP}hC`m={FwqPoPq0*_ChT)P&Q=S;)Gx-{Z+EX(1#(X-23X4(f z3f!;AQHZ>B+~N2d|E>q~Zs3iZ@AAob$U;;~dvRQY6gr#Qr%0?6ATIw|(;d zp%v=>e+ObC?&sX{q(!2Dm`I|wQ4XE=$abNs2v?}qK(;REa`twr6~7N1;=t!?TKFnt+87K6Gm|vqyg?HKeS{;rrfW5kwE?O`VM%%F$JbfTz^*qm81#&r znE{q9aicS68P_%ARcu6TCQ}U+10V`h0uTuUVVrw)gTxI{@H+DYg&s1fYfQ>#ZPq1!X2NOWL?)fd5_fJ)<Fb1xpiapZCB zt^u(z1&U@-2Wdk&eNbDV0W2P+DAnEW4Qniicf}Di zgXW!FT$3B#gY0Vjd~YZs`b&a^#67<e6ERU4F>Qt<+v z#FWX=rA=wjjCg}psI@fhJIR+3BsAP*-qr2jFIb~3X0GU+h@QtRlrz0)c z#aKM-P8+DnPb%k0L)lJk6*FX*hgju7D5rC7I<)2O^{dAuNHI)C;!PqENsXsimk;~`FV(0Zl1CwkD}q0vhHV3*wL*6tB4 zekGqMOpcQ+a!snW)j3X$yZk3(D6u8z>ZX{Dm&8S-BYXK;^`Xsu8AzJ+LRV_BT&e)8 zel1txXdpazR>{F-=Ymaxmp)SJ5tPLF>Nbu;Qc| z(tK&GIY#;WM4Ods?m_e>629uz6mOBpZZn-(Qz>j!K!Ey}1fsO3B`VvOf}R+|32}}~ zQ0n~`l*1qoJXIj~)rZ=3?UU*sg*O76Nccr2($_(|=O{u91aZVV{Z+Lt_Gwi_5eWOo z9^X)7X9k_?|5^+$=%GuzYWvNr2L+Lk{O_YS)@)tDc?8!x6f z0eqDR;h|yyjv?q7LQu6PUHm;_vowSb9$Ok=AF+BTTjSZI@(TR!I0O-ch@j=h>lrST z!u}UX%VGKcY}&Lj(UUzvei4P!Wt#7MvgKU!nn>7K2_R{m5_(n;Lk)H_5)CslU#JZW zWQ*V4ajaDK#olMzBg=Bb|g~b!PG41rJkd8Kg-?-pfU3$$n(fs=BhLb{5{w7_bgIuQ&;^5@&hb%A}FPJ+(fsId7jwL$h?|8 zlRDh?Is7B~g}$jINHlvq$)yMjye3hqbPCo|UfM7j6!&yPeJmBJJ-A05;y3zPe{8K{ z(NAdYpWbDXeI7;TW&a%U79|S)E)p$_)7vKmhNF(_7MBa7seo&CVNXM>7VSuvSAYvoI1dW~f1+BW|gt*W2`Aj6L3JZl`)A&Jv`ba=mK$?pj7gUQal{ zdvD_p=b%+M6lQtmx5{_vm5ioM1d!bIhvcl!7Z1<;w@cW``vY*7vSHKwpKh)%%Ki-& zmH^3<;Ulc2n&dEc4w8Obr&~uBifWahJMti(+K$ov#rR$zrb%0QYz1kA_R|oOCU!5h zA93_wmgMB5B@p^mJ>b|arNh#k#Se7hggB8W>6V!l5SlHz;8)GvY3=`A^%k? z9xj|i%O$W#+bpD`({2Dt25^)LGVNt!*b+R8)$P9N10DF+Qsy)&SXJoP@4#exwERx z22IuyQOrC}U|RD;c&&k(ptm^1ydXn;nE@FQAC&_%V^D*@LmHtU@ZE>~x3OQ^C1P$u zZg3m#sKQIb+uf%g%E!z<>pTC(kGKu*thfwP=*%RiSHivDqNaKWeH+tWJ$E0HIe}_( zu~$sk!7uK$T>{&aRE&RFEOsGNB3kw?z2Xh^v$zo3*465fGBV^7#HmOa%!60T<^D=w zL>Io9i{!M)ka1KaC$jq1EnV#WC}8~QXtV}pjfRHaPYh+Y7y@wECGLro7DO)(gP>gy zd3&IIO1GEuLoPz~h*5RUrX*!ZJ}gstKzakG`Sc_`yXDRdx+_rrw6I=+L(p~y_~qK~ z_K@78HBp=U^x+6tBOQVejB;Ld`2LFUCDDk>4)XOSXSdQD<>pq?wECKG=%h0>HFQ}Q z>aNqf$P^@TtqHnx79T`-GIgGGO0lt-!$*M4;jexARjJRhDPY7#tb&fBfUa^W$NlFu zw&x0=bYbU1yGNqW%YuxwvZj2+#8Jv_I(JWY{m>_o+{UOyJ^dmQpQO(Z=cHG9#r$G*WoHLEIeP3aAC?( z2mGXm4vBtd*OWZ1pqY#hp}Uiwvk8(C{rg^2gKh*6qIK*7a><;O`d{k=C)u%|8a+`& zIFW-^kAi&GP*Bm(oqT&(b}$uTE>MEbbGXj+(IA>AKnid;;=$OFLPhnLw@xcGBXLHV zIF6dFJqn?q1TdeSTS8ZmMTuqC_{=*PIqLz&MXf|;yiZUYHUZF8#~qnkt7iM+j9?+C z8eW$=9JRLvYtMD4!B{Yt&hvP%M(Xd<(X@*A+ccU*vrGmj>%r#k)*yG*{Ew zYM3&~)ZZYMEK3FL8U#Ber~fP$?gWh|OUBkW>W`KgBWT*R`ajG-22YeB23V zMGEgi&-r{9U+ri2+9Y3Jpj@WM(fL7f^K8YyS3WAt{HFVdd5n2HM~;w%4H(l9V}#g8 zNS^*qVMM_ArkATS7b|&eG!;urC5s^`ilNh?NuTrAjx4_SJw45t$0}b42s zrU3#CVy=iyDkE$EU`GmfC4)5S!4}h^k+J>hzfz_-H<$7dJjc60UDlGkhx5}A_Lz+) zbN>$3_QY?xxh<7XzLy|kj!$NYZ8Ed|I1_xPc&alz%Gc=yPp2?u@4(4Vv6u~Mux)#z zA;A@A3t2UX&{A~xd6Nj|ENU>2SKn8>v(t_HpT9@4nu*HZ103;lY2dD(e6HEns{lyd z+m9Q8g5KF%7^-h4N?*+8KLyMYK=f`oT9@J(El-;kOHLj`T-#{+0P~e{;xS8 z*{H3xAGqHSc_am`>+bB;18)cxZ=HjP-DXB{w;l1!F4he!IBSb$R`$M95x}5&ox&;} z8qh*oC{N`}He2paW>{=qNiiBMd1d91izEfBMYMP!hAb{&7A54y2gR-&(P>PC(Lkg= z5JHbR#XXR#(k@Y_HJmo@5xVoVf-O^q@Om*l?PJrm=T27&s1FEI8ypcuJsEwFi#Z{T)s^rLYE}!A5 z!Pk8lgv^vh6@}T@1p24Ijty+vOrw)nCmi9bB3Erf^YkQ`2WfId6*5H_NdFNp1hOoO zG8HnDs4wEGXXt#!ugkGGXO^ysSsYUlZps@IW>t3i+n)}sr8hp?e8Enfj+O-xnYBXw zVPSh#xE7-U0Ws|;(CNnfF!g91ouEH{@NKA^H*Xus&q7uQ5kFv-89lf7EUBDqtb*0K z+5bQ^yl>Xk+zCGSxqn)5vn(r!t~6iI`z{q|__bX653Tu*{o{F|qM&&Z2IN`2UP>4c zko4azxuKYXg(*r@RMhIOs>`Lhm?>^h5_BzzG5mR24z{2I1nCDzZF{P!3Hg6D^n!$h zM6CEm)A>xrsd6AKxs>Akcyq1Jf^|vRXzibrKpqU&8+yp~KI!Dm?VJ}PP8LD5$I!37 zY?*9DbU^a;KR*Yf`jZ6xj522$OQ~KBxD5p~(Krno(D{{pEJQvuWPcI>5PMwxR2q{~ zq1#(Y=y-*j6EvctfFvjMUmg@Mp(@4V#IK2BrhBG`MSarM(a&o$W30nhyn9kTPtN>Z zG$e-SAvMEIsDp>}9yL94TkBIWIWt`M>wAuL4gN4Y*dOIloqjL!% zqXyp61bX%7`=*csY6XfP0z$&Jf<>=r-qSFO*1m*8AxG1$hZrjWnlO9?oqXO1m*zZ? zf}-s>V~iIkC4+?Y-c+rR^GX&s4D(X^wvORGa9pVIWWL(qlOxPbfD{%?XqMae9y>ja zO-jS0j1z8INh;WF??u2gp;bi{Ih5eiW^T_iE%G;dzW=1n3M2-8~p{}-u9b={QXCFV)|M;fX z6&*CS&~HXymslPsez4>1N$$a+X(!aTQ1;-Y&q?`>W&>D4Jmq8YVK|<=^zMWVJm`Li zGom!Y_E}7*<=%b4`=j9^MAb|%>IWG&c!}dki<}4{j|D+O={r}jLHL9&b#yW_R`??z z>_K6@xQe5TCU4StUN>|Zcfu({vZ&=oFsj78jLV91ao#sL;E0&)~p!bu|)0*(QjijF&e*4}Z8 zuzB?6jMfKW>x^E}WH(oB>H~_(Jlxp3gxY#rj%cwRi!nC1S39pBerliV$5YV#c1+?w zUWClR#hrphM(tzh$cy|)#WMQ*FWSRUl=PhLqy$HpM(t=~6?C8;Kd5~~J&Xk+6orC3 zUcVz&gGaBG1mxCQ{(<+rV7pmGYp|R~<2~O(-b)@$goWyVmObqq>#2x9= z9Nb-dHI(oznF zT{{5%dR}8&b#K!R7(&~CX%-TE^eT&h$97q{qy(wncmBQM?ql;o`;siGeZ;bKlQ1AS zbx{&aDiTq&W<}N9la$GKdfNS*<*P`OA~R2(dc5FJm^776HQ{kQ8$yD7akL!{Q;~tN zMe0D+-vxB1o6)z>>RtLGlW_~2nYKV@ba*vlev|TY{BWYF#_MgZb;kBcjEaoR;dWJ z@Tz_I?yaIU$!|)xgHzdIAKkU)poGsa#=r9`Uf+TnQQ*w8?Ul)T3FAiGU8vO>T_U8F z%1NU#t18%eFTc+LE!2-YdB^~^nyC!srP?c^_zQ@dwdT!Evm`*e- zEiBMb@`aa`2hl7(gXmFRPmb?cm`LDw3XmT1xh$?`8^%2Z-X?p#HN?gJD=%Yt@|@mCE*$g#vls%m7|_wE=c2E zoBi7wy?U2+O=53lfzY~aK;}UZ)*P^XxrkQ}Bi+(1{@2%f(9$+9B|ufz)u?aMM6|2KY_gOR8$9nJ*;Zmy+26(*6&;5_%OYZajn-ZBrDkE^&Hk2bRsh-v#T6cN*rU;68qE$=wm zcWz*@;0Wwh5&z*&Q10*UYDT*kj-a(s-a%y^F6`-XR};=2Ni}U}xS^V0Kf70gEfXLK z2tWl6;>#WeW-o+plfo$1v-iRxBcY4r-T2Xv>->@`QxV~BT70;PB(&p|9RfY1YZn6Y zu^k{4x6VAx?p}wy|2JCKE@1EC~M=g6-F&OcjBf7A2 zK@5adh;4bN?j0KQC880Wo}Mk{jf?w_b*tnfoG1gV(`bV{q1t5$NAc0NW$dZ>LkrPg z+I>$c4^OhS?o^WQZQkrdI|%`5|05zxql;{8bwNHs%IZqugVnz%D{v>T6{uI6eBqhs z-rQAq`;X>`6fy&7Nt=uP&TbN`;%hT>Z2>8RrPGpL0mUpEUe4I%R3js^YU(8d>6()V z(RZ%y4p3*B%cNiOvvxSCM3PCrO1k*jRKT2x-mTz4t;(A=6@7U+?-12(Ceo@zo6;fn z&eEJO$c8htX}hRV!+XbBNuN+CF4V|sZ4e2J%lXmS$a_U;|F$;;S>Q4)#thNX`X`V{ zvqrhzrJ66=vO3|bU12m^g_O|)`bpxZ{$@FLZ7wD`g+!29B00^7ha?`%j3#P)F+TKn zp^(1F3IraVB@s5UPp`CP-(*&pvg{HB@pyCE4PNxLwqM4geA>CasHh!Jhwjw=f*JGy zImJdN69Whm8jCA@X+V8szVJK!Lv5+vt91zCln*F~;dFtbMuPE&Yn3}j3a6AZsfoGg#nv1Q6B`0sd^F@dG^3-gf+~iDmOyfZleGAVQyz0M^y7Q1nOj! z`tq4}N0}Q7U(S46ZZV?PqSS<<5 zH2_txd|@}A{R-}`kVa8QjB5|TFZjK}-W9{m@gozNT`*H=RycVh?psEKyU&RvB`8!XTv)rBW;ZIL1O-XNwl7Om+%4M!)ZjRZ$}DT12uAd&l=L*^$BK-tUy% z%K`@<2R{Z-?Q`o3CA;SusYh5({F16_h+_FA6PwOwe{Jxvq>H|^%P9=GoHLcQP^y*E z6p1kqOm?AZm86{{syS>_CyXrj*|XSPYFhR&tcd~}U>^bQ5A6?^NFm$fF_D)Ov}rZ8 zm$&*Pg3q=x5Tp|nM5fpxG_Q&j%sQtaXZ`#Izr3r+qJ{@x;|e2uHfPL8EUy7$g60a` z1BD0$*cX)}QRt2_#bXGwa~=bUt+5F}n!lw2V%OwL;y$$OqU^6dQfu^tb;A?AfGXRs zEG9|z!K|C|uieFT-4z?)!V6596=Slx*U_>DlKR`8?5Vq&%EqeqkjytGB*c$HLz480AN#dH{zRl%1BFcQZJvcU}uX^M^Oy%ZlwnJ~DwtlgL^3 zyg(a5b5Yt``TTG#r{`IyM^lKG+yIN_6h-T+;Y&|RnhIq?QfLDCB8AzmS3D@Z$B?mT zp%5OI-R~Oi+cnyBe2Z$S3?ZcWWQd+-C7N^cqK8i_epVdkL%r(`Hg2bTmjJVyhbcGL z!g>{of@n>euoW&NqN`}_Z_ef^t6rKoaq)ek7gtBFN4qz_23>9=bf4tK3$$6<{xJEnl~DuA@f?ruytcNDlQgM;fvZ-5)eXa$!6u!h|u{ z($c<4uX*VdZ65Q__$Sy~tfJ2|sm9{)NL@1{;5d-w23d$7i# zl@dz)s7LSEd(wXJf;~eO45fpykZ1ZAitDnNmFX%8@HY4tSYVYOUEkt;uLQQJ0>*}4u&@B{^zaX(8(u_u$E?bmV=PQanQxP&ECWu?_Sr;MxUDAcEuKXoMXOaQSB zFE~9 zbgkB>P#9s~P`{gz*uccP2_ZqN^jJ}?trllrs0m8l+cTjHJsp+18Y&juGA6QMlBEP2 z6z8rx6NYutc}wJzz&oFGaaq8nZBjGBu`^xT*c&lzX6EVT-|;o)JuXmBluI!|TsneD z>Z(1_ws--B(y5?*YZ=JqNQ#TRX>o6>v7Jtp zQPe)*X{YCDkqW9FmoAn47NH==V-Bv%n=B*`h$O=<(u|*`ZLyi#(s9x;rI_rOkEE&# zgkqulo5TA_dg~{#yZQ8<-NGsv-s%wUC9Wrsn>V_{9Dqi}ibYKq7{}RR%koH?n3Epl z_)-s8p^{>XGUB}brJH{&#-$B1ikDASPg@m*D7I4t>kOg7BxPCnP;jvfjN@Ru40gEdLPu~+WWPT^QXLWL7r;D zWnG2|8gdOyd)-6R{+_5NEZLl@sbI&$7&R%FOv}Ww5g+Eu7{bTLm(oG!)2#RS@SmS@ znQr3fm6t%`&EB?0rcVrn2iEx+4?>%jVau{GSWnNDaDI*uhC#vLsM(!E<2V9%mLgx@ z1k`HJ8UjRcIbQ-7$Qak-j|(%QLdO{E@S$MYjqq;HEhSEOAf!@){Xjc4hb3WQ{)AA` z$SVmI(uHiS)2cZhovm?25E`-ku`;E35`8f*M`PUN2>SZNrJsvpo#}DeTkXBJnh4%$dMq)E6)k8FfhyjZ43d7dGqO}zu6qPr_5*(~ z6mlT!UfF54(+^WgDtsi2@nXo-`X>eae-A#S@y4#ne7Qi1SRMO`{i`BH&%3qvBfThn z(%1)lzdcn(fZap)!ehPs&#>>i(X#CXg$*^y4r<5Lp0?#D-mHOFB8QM&{p_DWnj75nSD!*drQ zX*TlcW|gI|5V6jrxHs*rbAb?*U8$X=~AHBu@mMs5oFyH@g^tC(mB?6gt^6&lL#a|i=#ff*!HSLu3J>VU4 zI%VxmLw(QwUlu?fy?e~m9yk6zeUAKN_?hUVpdT^@Oh$<;scs5nHIsa&wgH6~PB}YU zkmr=x@+dsI42-{6U)g@B8H(-ffiu$sSoBX1WWR=?|N9viV24f?4>D0YQ#0AI$<;iR zU+{scZIDNSu7tt#$^(|i)WKG$zqwDxhIW_0bEFzU_Iwmm*}?4`A1NO=S5@2EvW>(dohSB(ci%i@{7~Ie z0>5v{qbf;C82lbHRD3B@aL6xk#Kf@y1H(8Z?r`Ti>5C`BMA?@omRPXGRK%PYAeNyg z#nv&ihO3~PfRIM`*G&c>lGtqGiXk*F3530`zjomRm(f6ja-;BHPoR@*E+wLfq)$Qu zb>MQsCkvIC<5)Zt$+VzWVW9;}hN_z0^q{@%US?C6DC&%=o?sINHA?HL<$;`D&Awd6 zN=}c$>!opH9Z)vMW`nt_RQa^wY&q_cfrJ@Q;)#8H!8WTbZRFmS+Qx(oX?Kr@0q`0K zAu1(FtbrAlP||>=FQef+Q8TX9Y>W zQpHP$vxtN49&qj>E2Kao8bmMV$h$`&KD(8m|BXeHoGU?Be@} zQ%@PuAFuQ3!$~^YkoA|x?WPG2Mke!=PNwAed^vT z%3z|-Ye6e(bEyF8ssWBg%&Q4Zx10*h*yg9t+kHzAO9OPf-&EkVPcXZ@MN%# zD}R}*{cH1j92!)naP78Pp#pS=HN+u-ETTKy&(f+w3!3 z8)o#boWFMA&PPN%sGuT-CLi47XoHE}h$AJ0%5281%?wG+Ok`EcjP*Ocakzj^gEG4c ztfZ|FvuBmJp4Qz*;lT!n^PWe>1;P7N zg6V#V$^9Xg{8(OPB5wf9++yc?olP5$hj64Swe;xPA*aIDZ8Y8g(JqPqN;m^}%rVYN zVjn6+xuR{=63EQu6wpJtRmUmo?d5CT!BAWF4@#_yng5&Q)8!!+cmNq7=^x1>a`BC| z566^#9#IUoNXz6*-xPjEb4hdd{8LfEc~%hd{Y8l!wjehDEQA7Zg6x&=cOc10fokO9 z6>u#Z#Z@hVmT%AKySjQfX>?8ogczk!AwA60oY)0|RQkD0Z(-kem?v(Uh-%tBk`rh& z(0)cKu6Jjb0bFHPjSHEaN!a)pOzXrLhyM3|trt4M#;g*F*gHICyGRK)m3xA$gs&5? zWse5PdNvx;$K434hO%YNH@|@_@;!su1M+1iGmP93LeJ|D&)RLBjSaLhV!+|7WixMx z4XT|Z!k2W}eX++ikrSh{j$|K5E8frmIM5u$A0D`yat~ETm=PBJS>l=NO(wQI2&6 zal-%;5<~wH8u7XMFch2J!FvbXgaVXj17LM`031uDT+KI}i2Sh+pAvxr9-qfwV8U;`t0xF{`%pl0r(PP%Wi?FcSiL26SNS>`N^ zDQ4Va7Lnm8*dTua*l5Z4m*>1j&`-v@r1LB9841jKvm|B4s#b}*X*O?2yrTWJ(VWc3O5u18yWDBkI*rFx&tC(LE z=r={jZU8=^k(_Lig?5<1AVd&-u*U8075)(#|`?u zAXHB$$R(1rdqbVVI zQ{%L*i@bgRy*gFY%h(fzd1$LU+nXr94icF!xS$*DU512UxU05&>grq5M*>$HcI+W> zIB}Lt!c&R8um!+r2a+BsYF)p@bV7r^34*D_(39;lUQC!J|I|qfxIZ44t@VUgE8&CW z4Q*ga!A9UJgkid`%>yS}s{KkPyJWvwjPWhdU7jsyKD(L|0p*{e87k(2o_*=CY4)I> zpb+lxqtg{Hrh$%YT+yj8_&ZuDDk!NdMHnOy#pt_d?HPCch!;ODiI4g$VF*a&z9Yp!1*99s7w9&fQArjk z_$d9$^^~&8iGEZ^{V^Jn#TFWPy{t7W7Aci;Lw`Ktxu?U~gy#Jii%-kClA%|E1kETI z&`_rrPJXEG!aDJ>FET1t=iu9l`H1?iB00 zx{@S)aCj7de+_ZYxpovXn*}~5Hm{2(gX};Bp>#G^E(84ngGUH-$j2!hmMgZb(3D|G zUJYCN1CYNWqQ4J=)&knB%N7{MFvE@zaWdd5aTov6K->{8jGc_lG`F9;{$UXl?|-!m zg&W&l?@j8_%9hYHln`7OjWdN)}E`6b3Gq zLN}p7BSn`4od9G8vH%WY3c1iz>Lu zdlB(j_O}pT!U@Q3rKKBZ%Pqj2wIT|0tD>XF1ea~ml!`%CEYTopnb%4)j^Y2qNtGOF zQJNEG+l0e zd&i-sZYom$u*W1!=&oyGNcHSgcLb9?dh*8Ug_R$Nl1*tKBz5c{)T*^ytO zmwO0XE#Wc);^7H@lT;YO547KSGYaZ(<~43j17y8^JhlT;EP=M~2T6TTb~bR{GW?Za2~J+7@<~TjM1!3i+48k*PtF;4(b4 zWRR&RYU#Fr^>003Tl(ZDCYJoN$=&JgHlYmh=>fUBHnr|#SR*hP^|^uRi}^Gji&*f4 zY)I5R8>a^wF^n)^7qZ3{!y#ueSe8O-wCWDrxt?L5bo+el^H@{B6$fun==yh34@bN@ z`6KUDq(vg^Wx!1gt!V}KUKT0rLeMAI3f)aEJs5sIi-@>SBucX4PH1Qd^XPxntowa8QqseFQ`ffKr|K$z3)Zv|eIe)7F+h1}I#+&#Ygc|53pCg8b zM9m!mxY|wZia?LK#T4*A4=vgiJO(3_^|=wO4$_1uJK7Psy71Yxtz{4xa(k&PsrRqrR59f8CpU(7F%ARjWJh38vh{OHYJ^A+A9 z>EZJM@Fd@H2$+i2uVA>htyf&SO|S0I-RFO_R;MzAfWy?dr-N^h-LtIu+=) zRR{0Be-h-8nPf+Liv?X68?U9vC8_w9ioQ8ec*DrVKFv$GLwQrOg=s04-5Id4w&u5vyw!?@25fT zBH2naH}{ndT3GTap`DN0G!=R8;wajGJIp>6yN{TL8`zyh1FWuGTpLnU32&t=huRs#%~{2VfH{c9-)*?Xw~ zzEFCkx=+Y-PH*&wMC)HyW|lgisrk${{Cc)pkxkdn462&skDuP>n}505qm|Qa2z6@% zy6v#owQ;A3(g>97l``JGcIE!`o#^p=(j9g8H{%O6JKb4z6V$Jf&-fx73)Tu=hW^W4 z)!?2G*ej^SHX*!j)xb~8Q4CCinQ44WRlKvY1?Q|`W zRRZB?x3Ka;g6o%aesj7j*h)Q*E_iIPsustK6HX(U(32xceQyx-+O9jlLRsf_Esbp* z-~Q;=0fmINC96;jA7BWCFlr6h8VEASPeJJWAsUAj27BRv$=yK(iDCsVrKyV_ekxM% z3m(Ken{I&g;uV%hH2h4ZqgVrRGw_dQCOB(kyh0jB$qZ&d5^x-r0)SAhk$40}NoR2n zlID+{B_}CflxA16w@&lYp(|JxVdZG3%t%auB}+SB_CWd$lVq^S8Mtz{g0=EA@*-XP z?xbjvqF}CXRlyy3rS4293_(LcXapdqR)Ijt=2&=tUzAuoeRWfV z6wT8tM#TtiSi?J!w2&${dw&vFmfsk>aeX^)B9a=C`J*=muyzHHcU3sl_0rn@ei~(34*7BU4 zL{gJ8eC5^1#n1y=j0r3o#xcUU=EmU!M$;LEB(<=(J4;5M!k`djcvmgTy#EZtEhHLn zJSnJW99H$4Ac4z1BUJ+7h+3t7kht!N#=NqaHV|(JTwx7#o2j&YX?S{bm zuBp&S%PaiUUNW%rUgH)O^$uyqB7zv^mGLj06TAQn5cwyvLXth38n0rEYmw@nkR{f6 zLj<73fGITgIM8L;I@2=!`)%Mm`RFp58#)65n8bodgN}3>XCAWTl)!n%9 zEIv2ffs!e~A%j!d-XqsV8gOhfvcrO$5HBHJ?6xdaa-%!a92igE!q%xD5W58@QTS>T z{vv&U%Zyy!_KAf#JRH-vVx0F+p(H&?Yhuzqqk8L@mP{xfik~_)PMQ)k-Nn3m#0tARrG+Jz-P#t&@i)+`D(QOrdT>sq4^W4Mm@n^(0_~QyITAD*L z*6gda*CFz{Jb2u8`TZ6HL6eTnOQ6wYEzIddhd*qBm8qtwpJO|7Q= zL?%LM>vgAUT=Q3{i}$~N2bECQ8F^9gZm_!#Z_ch?fjZE%B9ihU_UF>y@SK*)n73BX zQVM?nJ%T9X%Ggy|bhf<_#{${fIm0N9jEf7$)eW~nb{9g{t!h9Jm8bN!RC{ynaHoR! z^2$-BsI4W^I;?F+rveS3e=TV7P_eu^=LBxcg{xbx@&fF1pFM zn2n1NaUjzsHU&yGI@Q>POhsG{rHSC8pUi?9C8@aC2&KNhHh)2dYuydwFFJ~RJWT{j zNXX{MMva}*<<89P&P=t1E6H1RFd!q7OSHKhmt77{Za!M`pu!(!<7~MGPu}x-V~D!@ z^L^j~u_jl6rVxc<1%?ijIf8Y7f?5_S0~ROg{AYjvq2r)g)kd8KoX_jyim~WaHa3%Py5P>kX*Un zG?p{>pZrPa>Y?JzWLTcEpe9d=!njEGg->uNtW7dAu@=vMEu-A7*rRWLUTdwobK1*J zg|pYc{t{{p6?ko}%8drt_Hoz^r^S2bfaeK*e%3@A+@RFl$nJ5UH1ZHmO!Q~ZK7y~D zQsDq1g`ldy5dK1D%jEe`7Dyo#luFgt&K1YR!@Em?<}uXqCd4kJOL`i65f(n4zD1e~ zx919k*N?dU8$;SjV?z012+0D6A!ev)h$n-I686!+^96-nw#%G-Ggw4lg|-`INvC>W z`-@qYx~hTA(|2Vk158wL0O3ujmW!|*ejY5I34$1&Y&; zP?)w1u@R@Yd@uIjKVK=pbGi_FO&D0d9|*;yD0invFE?&$s@6su35KA;h%FiU3iBj* zR?;v-I!b}cA9)|Jw@`S(cu4!U6?R_%dP{k@NUei^70CL9VZGw|3&ud>%JuGrNenY{ z|FW7FgeXTSJqfpUnaUC&gMtHJWq!XYjmuhqG5F=8&lx;De>QR0XiH_*W8@rvE%FH@ zuywaOS@0CD4w$0CWnLnF&b;_7_8=~_@ay)38&U#OM?zz0uY-_-!ElvWY;be;@zec@ zURnc7m||Ys^&ZHjIdJgXEx5BkRYpJ0^aLzxT!^Vve+y_qHL&%@TIb8EEYDf4p!tlI zrLMHHWzv-^$esp*J^DhY_xu3^f-AwJafHm&-bCVWd9wKuQoQ(d%?1$zgb4^J7sk>n zkuqrCpx$}kX3UIZ2yohbijt+%m!n?sd3qMcsk!2VK2U`gV?Lf1QZ#c;E;jeLgnezr zh&x#W7WGmGN^c$TWlEnSeD)+hjKe+--rm|m3FBBovj`8f4@ub2(nHu%j|3u?QK1ot zsZ#DaH@+|sKeZ8Z{C1=bvT|9S=pa)F^VCVLLdF$A9Q=hLTvp4KaOvq1K|+g zh%&@Tx#)`(8aC+bB^#Uy&VT=JUWlioy~9fRf8YNz1NjYzp3m5t1N_f2`0pP-5Lz^V zwj)+bZgN*0MG0;k&S&YXI`c6~jMD})*P0TUlF%O#ZvSOK zHPD<{e4X6Lq|ipoGMX--^?%I%Ur*sPH`osRHdna<(dBd7`O}|UnFg-$*k!0~ZAHzL@$ko`RlA#+&I-I6!qx`8;pTeHl|p7I zTGfGKN4rT4jDn$?Rg+}WGM!dO0*#cLws!Wk+~sukBCb)qR$~(Pc?S>|hiF|M5MeWd zsr=2@n`B`wJU@o?Enc@ov%Hi{;M76^VAg3z?Z9-iSGBz`O89w>>1OMEM0dI3th!;{ zly99>WrI|#3ZUtav2DK`U0e7wF1s~&6&=m4s5y%()J$iSGTR(%2#Bg2G!Uf#CF*xn5G*;Gf{Y@=00hkYtvBI|ei$KZ?WZ3<$hes6?+fTJx&lJN&(%zI zq2$ulcA0XqrmFs8@kDXrptuA|?A*ut1RVVW!Ay&ru*gC^O5^Gmt$J$aLQ>*2R~8l0 zvVv@HfqlPOk%{-?9lu_YxtFil#^=x6zi#a@8q)7!zDb@UpF$75I0Jp)14oygNX+2t zD_1O^P_OYsJL5U*DHQxSdXp*y4PMX5B%Ts)HKM=#uqLPEyqF9&zYt+S=J#?j5nFvh zgah9y3T#yQ?_W%lbt7q0Stn?S0$+EMRBr;%s}>Rxj>coVwl3xnicYD{%m|$?k#T!I zgJ&>HzCyCtH(CA|Ys;1_ji8EW`~4=P_}p1|GYOX&#r_y27`Zqc9f}hueP!4gheJbf z0-4rahJm1OqKm|Z5tRm!i)61FtNGMpV9%srz(;9xvn{d?YGi4#?MwKkv-p98^aI6B z<+=Rj`cZ(o_X_Wey2G;9odVokOmN*Ukf2utxBjEzGdY^{iU56d<`rj-`D>e;_>zac z$w{1ym@N6z&n~x#?Po@mRZSLYIBReAKMLgtj>j%tw-P(~gTIAec)?9v z>YGywYimF1!53HUPc=5rf}vSo0~&v{Tfm9-Y@&A})_>KMqC#N#o7Ki1$~|(n(i0vA zTy619P<-|cNH?{AlF77C8!pj@?$`e9&Iv+`A_@()<8~v-y~WP z-D4&=!Kdf3f#Um*2pA$fkN(yRVT9M_qjw?osAdVK;+19_Q1F;xT&<8nckFmk@=Z_M zq$!DF{MaqFr2MHcGMixRe-hV7TyX3kp%wnrTX%>a6d;Gh#E?oq>9d#TwRhNi$I2#6 z5S}?ZBZ4E3kkCrCXUyNkt49ff!R}h#PPDUsjUQn=Yc$OsBC9>A!>z*|a+*CrB~dAx z>6y(e!3NTd49MNFN{zCL29zgJTRivTiNPqi&w0P14|bRLl(6jiuC;k)Jpun%)q;^d()d7hB^nStQ)J{YmQ+Bk-G!Yl=YUNTg_w+C5l z#KJ89Aq>+RO${`MQ0c{pL=7m5@xlK0*N-_Z_7i>OAN!fvHVUSzXn)&loM%D$oYNwy0u~=OU+)`NQgQ8 z7*Xhg*xrREv6Pj|Wx&j9d-gxgJqOgdKegl=FrTH}=x^ z{yzXyK&-zB7?+7RXg?O{I`(F5D>9jSH4#{eLZF?Ph`+5dGQbZ+IVSyyCG?z7`D^Kmwm6B4X z#J_P=ANzkP_TC`R)j+>>o7x)~z3%~yiqa_t+v~p~`L!+D?#q$bD?6Q|F4g%bn|ZFT zX_84vx=dT5*(+qW$vXAs2!euglCT?P5!Dvj?w!k}%`#zK*HT%NNik}TMY87N(%pAm zG?pZ_=W={N?>bCDna&asjHk@A-;|0If=;ACNLh`fDzXE12!*6AvoZ{s9dTF{l_8A+ zk&FwXZ6-j$OCc^S{}0lK5IQ1LAq1*5wM#50DXM-SCoX3 z$Izmzoiog`i_f#hBaCJ+^J1q1G{l*1PU#8D-$8A`=0TY8bIk7IASfXqK=~>QE|nD5 zEcCS@qjk;-N-X)#lVBXI#b9+Yy?;-iZNR#F7%?#C5e6sc=_9PoRAF#t=VT7e1 zuhaC<9Ac&o2tp80NsI$bxQk~K#?d!EbnD`qmHdYz zf>G;%g7+47Sk=&YdOtiGZ9~k17NgA()V@%HNi11ABmGbG@lNCX{-lB>qYFOw}W zRrStNRGlGUnU=x;bQYmQJVQ#Ce6i71%u6mTYXPliXutuz%OeryFQl8?-7Gl)Cp=r- z6W+Z=&Y2b4u%OZxYp64Cij z*mTw-#prRgYX3{LyohD(7I%8~mN0_|=qTnK~TJ#7$#J3P}PW zF&2X)mEV7;*c?FuLGP?<8IFd~Y}5&$4}cZJwV@Q-YJeVg_SXP7~_JtZ|5gm%jdycSjGB914O|l8=QRL(x*mTYR{!??zPsF^q4|!W zSz<|NZ|@9Npek9{EBtr)tw6rUzi8$U210cVp)P1*YTEJ+w?THvur|IPM@F zlVbpBccZ@Emwr07(c!E8<)G}kd~}V{T^3M5IC3{o5R}{tsM{xLqkbR%2Jyd80cM;+I=rkG# zuiI_u%$+l&nIR!0hC!W{zb)Vu{Z-43(4(0X!RX0jVRt5%-5kI|`?p_OSG)Sf{J)V# zpWA-ec#2VP5}c=2@v<=AT25b+gwHEGi1zMF*lgWdt@2r?JwL;j_3WQzY9__cfeoX;yf z^80SLYlldZ?uqa>?Ae748SUvY=+2b*s8y_0vXylu=@@MKq=X{6n56an0pb?&%`Y;} zUrucq8OZ8?(otp_7fB?CKM}{zp`?5vkQ@q7$sv4uP|r}e#p%sw4I-D*y*Cp7ZJBbl z#)RptqnegRBXcLwwsK@ltTAv*q4D$bM3PH@+=`QJhev77LhqNDA!BA-s4PaT9Wo#q zjTJ?iq#c!8-OrkiPe5ZrG{m@U%v~}#cuX=%HQZDlr6j;4l1!6v{0DI4Gr3U#O|k4j z+Kd+bWHc{L5GuWAC$9v#@pP{Z8wzP``1@YqKAF*l?r3=Dj8+l2lm$8uWj+w zlzs2@uu14<#8i4qjKN^m@`XlXn-a32BHIk*)(D-*s;cYJQ10#hjx^Ief@Z$-KkTgs z=T2?HA_s^N=FCn3nM{SYd2Amf=pwh0CmeEA4shnqw{L5=mE5~!_4&^VJ1&Ev2VX)X zjjv?X`V3+WanIRLX5a6(+_)sE^8K6mG&7+InxROU$q{7;DIqhj`+sbIXn=Q1^AC7h zf~U89hroZ9kL$Ya{u<-eCPg+Mmbe1T>U2AXTF!g_ybHIp3j{H$P>#n5g`iECz^#{@;nbab!SV89Vju*h6p*q6)pj0NZ%wy@3rlTBSQ>5n)H`6T8 zN7*-48b~vJeB6DBHvNzpR%#)OYtBK4OO`HIiuaGG&Pk>wtp5MX718NR*agQE zZ){jlu!JBuA4KN+$buCH!mNll}R&3{LwhjK64)r zcX-YYToGZ!%-*z<2cU7o@ijdGVp$9kHa5nN?ifNe#Xsj9z z+96L(@@G)xr|FGN`61PxZEX*ML*Em|4^MizY+WjQ@iB`S3o>+j_8#N)j!BMQhi(74 z%n#+@_*JjhLE$sUL`{qSkG_pmwBJe~UHQ+~{5dG2vCpHEo?W_}Ru;S#15Gy=xnGC) z>dii?%6FdMv|qo!^`BpFC2zRw&xXw`|H3VbTH4Gi}= zxlo#CDbJA}nI4!IK<=rNaFxI9Pv?d;uS0xrL|VV|Uo!`+m!_L-g*0-+d$=8h8{}-Orm$w7VKq zR8S7Lro->s2iF>7;ZNURRXtGas`{v%wbe-rKKS$5_(|!q>kamom!%7OW8{8?;fbRY zN~u8t(I`PDn(6nh-gjo90F3&)&}?r9+<-!y+&5nFi_t^PF*IDx`n2kzHS4oyRB)06 zbP2(G9^*=fj_9D}2W>w}QJ+J`(=pu^r39tz>7!?krb;Pp^hQ4q8hA#f?W%QFbz#jy zl~VLI^cQRTq|pyP`I|OzIds%jrij<-`ru(o_FUCN+a@NWBR|Vcwv;J5p#=A$RP6Rn zf`>%_>tZh4bXW9vkMi=g&U@s=dF`&(=Xub`jNMWc!a4$oyfVuJy zp2?@ob^RNxf6po+H@3{i-H@JNXNM=*@qCH`|9#Ln`-6$U33k`+^LTxiOPfJ&$G%#p zeevp#yV)-nDSHeuj!|r9Q9vS6SlgkA!o)swtX^sY`VjZrRDIq%^v(O1ZTj|sZc<($`DEB zxQs-@Gq*eg{16CLP9F{)W%C}>7LBvNr=LuoJ$d%(juJqQfjBP*k)=b&bWn1Gwx6Xa z&v%}@kZKS{KAumB!IS?lDM7-J35evg-> zqGfz3hDY0x-><+;Q|mMN%Cb2Z#N9`q9L;Dq*nNsTU)?j_{)=K~^d0X5;c{!>Ro+^A z3Up?vb#JLP46ASM-NyKhw&g^ykHM1H&4IM&`p&bh&fctXHaY&V!iTgtdzB}k_LJz^ z+c@QA!s9%4v||@;OUaaV($E{KtZ;*D88_8#@u;b+BAFh9My|F0Qw?7Pok>^Bs1TH$ z&%gH)`!yW0-*N`^5y*!SRiu!=R5V@L;zy9YC}i4du(YXzjS`Qnw1p-mJPP>E+S&GadM8kM5+Uk4qb~;q`a(M@;NvH#8|BPHsI&+s^})Tdr*FTurR4k(zwDh}2&({kBjdXX_~wp;$VoD0sD^qPXX*G` zRTkJ{nJlWvK<99lMeqUQD4)A57s1l*taD2l1AvzvEl}^7e57$3( ziTvysv4{jAN4xO#_xwra@%#HquYoh=j@2)=RpMK!gV--fqnI3fhzyxcAW5iq34I+U z+#vj^J$}QZ0~R_Pd%5cm(i6jN`pmWk6{C0V@%(mIQ#BVX_v~ldMh%4Z9K4M>Re0p+ zbHq>}{%8%E9LSKU5#Au=Lk)R$Yc5phI<=K1qRqIPCeT!{bsr`0Dx9Oan!bKu+63MCc5&Stxd@uq?xNUq+VLtL3LMTHiAT&`&B7|i`@P=% z%^o{m0rVHP!}Rvw=OU9~q@1WW$knT`=JidmrAzjYq^v8VJH0*r5Q%r{4ZXBg_+s0B zR+{fR-1^YpB*khA6wpn_%fN~GYlO-1rIjBV#C<v&pTTS_F!dD082`;VUfyu3AOJMi^oPnvRM6~gWW zR+p=j*UL<-R%C~2(2?c4wgxNd*Ze6Z=%$8a_o1WE=W>!)K7kBQF3u_DgfO8$)G6hb z<$SsH2X{|xf|68+g7R~yPubIh(-=w6Rr1Yx=_^xjujf?Y$4_I zrh%=-g55V+W6@JNn54{&RvMUvcG(PV>%Yokq6j#>7alS%_Vs=$)ydvC;lxcj!jf6G zzLKgSQkb@rtb%3BDz)B9%Wok;);p%pL=*;e!dCt6*$B2yBC_ekB7M8zQNiT9@{>dF zHgeo)l~Bw<+Rbsx>pOYoZbElz5Jfh3`s8W8rpje?Js2e7EV2z% zxX%SjpFCW)4DpuQqw`KFUq=e{Xeb$8Wc<0SVph?Lq1m2O(U%T_Sr$VRk`GwoHTy@B z2Y*sdZb9s;MfW1@8z6)0V$XGJ~mC&O)`<4+zIvl@!8Vu%xB@bx_c* zcS0_7L7+|ERWv9~w6R6tcuzf?o9r`JloxIg=Dw8zX-I)O_hCFK@)ypmv|(94J=8_$ zkr}4T3)@XbBmyr^v!9vC5h_=eq05UOv^U#b+$-(4prkpGUH!SB7;O<&j%`<6iCV!K zi%bWWwF@UGJK@>d)iq|8#+oh74Bn@^Pi}jTZ{0l=$o3c08QIfiCQ4P&2G(n;4*K9a zU!#J3{{c}MxQS;TW+Fug+xbt;ZA21HVlVcyt~ef=hbXp6}A)d;d> zo8;``F^J;Zl?6bA%HTNJLrQN^`>lTmUAO!8a(_oG@#PeiRSz>RR6xes_k8?G=RD;H z?8s!=;A8K-8+Ll^`kS+_y4`-a@j{CbA-Nv;X>^pN(5uc5^rRmbZVVaN5=kh56HD~f zRQX-q-QC^|$PIVVPp_(2+Z*GC3YrKhQ8SU>>2oR3Dt)MOmS9Obq zxM;!c(Sca|W3TG^Z>!;@iUHjw+Pz4VX3KuQe;VmwB(80F&iaeHx0!Vw{5@NK%{z@7 z>-t;bxY#Wl-Hsdn>!xI<)7P=)*+|p$@YU7ncG53jqk`n}&0eezcRxW!m)Cv@CAzTD zq?p=1H1h&Li~4xN*$s(XC}xx+$TKxK`rk2=gNva0c=-8a1s!?5zuig6Uapx@ZBR6& z!(}jg;UmLYpXVwG-SodVMKy9FucMboPKvnh^Bor++lO9`USoFaIC=MatTt0lo?9Yb zla`&3I`~=SsK=ukY((-u7=1pj6li&BUhUC=$8Sjpuco{?mrR#0xlWF_&zI?W(*OQ? zxRTuC&%cCaDLe<3YPzuM&l0TpW`)w?@PvDwQdAM-;ni~Q^zH8zwo{mb!v9QMQA~D6 zk~yVB2h5FjTiH3>Q@S^;_I1&i)uyXX|3yWD^e$EQ=X}sRd-f3}Z(I4r>(>u6#b@fL zcU_Z(2|n1oG0IfYqAHD)N8evHPi0e-9x#tN0dAnUrM&b@m+Px{Gg|_J%RRZ0x&XS9 zmlTvl8`~N;_w;GiWa)z%b{ux$N;hNbAKF9dxi_oV4;-v0q0JTJ8hRe?f0b8oV?}Rg zu6q$29LAoAc5_GG*z@bRPU9K4ryMcou?xrZV;^IKbnJX7t|v?Lzr>Nc%mbIM;Xv~A z@6b=rI`qfW;MblLmTc{3ZjT)L>G*E0>j`BAr#0EC!t8t1p{VtvWtZT!V~b;p!9iqI zqkm3(ZO>+vYOf)fNu0x7Mz21e1ub!zQjgn>81LAz)yJCKZ;p)|cw(C-8oK*w!-unnKS$nZHF@p|-$9>qUN)nXPI0QoEU?4lx)y<42nWE;wQ}<19#$ z)9c|>=cl;l*Lh62{@ninh-n~UP~HP;kDJ+>pBxazVxY(ysj!TOL9Sdjb9F)g9Q!&U z2yt3Uj)&&SUFjoE^Y7Wom6+u&BvT8<+f~wre<^m;t{i_Fz7WIk^7m6mS2w4#EHl#Z zGsx-PEi;uA!rzHs)Vkh|X@=6cUrA5z5gD;LYO0cki$>cY+qS-(4>hm0T4d8F-ULMM}fu}Ui422UlAS~ZGF0F z7q=c-Wv@H%o%r3h{N>#oy&7@k_s<#)^mldi-DLFR%~6_lSX%fTb#Qf^^L**USwiWf zD9*kcxhEb)qcms0ddoUI3vkMtt9aLwz4mG&o`&63GJTtRCTF@oJ#^_ly`Hgcoh6=} zObUeLhrCD!L=|g&s9!T>3G_oI1H7hK^kCaTi-Kj}BEFcK2J!%av`jZ?aj= z*P7U|TouT4Sdg>jOq-trH)@y9tAF3P@V||>(d^5{IjG4`2rgPBptAHQ4?D6k%8D35iYv&iJuetn&j?E2IdMwO zdf5XB;!1SXl89Ak=}Y}FOXTD$rhgXt zMnn3%w)hf%eN+&1?t)5XxqZ6WeOhvEJ<=w3EmOYS+a^jfEXPF2am$X36H!HlzKK{z zJ#lFALcNv4m#(X!b-QkQ{WfFE1>XU~iRsuD?v|eZm+-!3|8EO5ZByf0lZ`%J+2gF) zySm7yn{h@QljCMpUoMCBX6*jk_0(XIt0SL&jkwTZ%69f=(S3KE^>>?kwnV=$xAIk+ zf}<>U8~Wbd{DtiM$Pgph+2^m&{JvaaE53(^Jb5wAd@8~4nD;7p)>G+}^W}xKR|5wx zYb!oox#Oam3)-I>tSOF+>{(jFHT87D5zT(@zE9^~9CJgX#ifNiX!U6}RJzY?kl9V; zctfw6-njFkxb^h)OLf{P=;xrXF1^_;1O`_UdEI3sztgsNQH~l}p;G156K5|!Q1@@%({5@u(A}0(V#4D3VYfW*e$@yx9@9OAvZ%{x zr^`IOnG!SfTWn6-XAftrFY?W8ySS}6X`Z^dC*MxIY1a?KR_|@2`KkJEvo<{(H`&W} zzb=}K^r)R1ETumz^m1_a5LMreVbNc4o^qjQr!`t*rH0W#a}j(ft{NWr=*)U-&70*ka7(68zXxGh2t5z4!qNW;JRrq1vrEWC(JyXL~6Fj#0K+6+yB^~CR?w)(x zvicR(Xfz;>JvWyD$fUHp-3VI|4{rs^8LiJ+-OFsR=8jm^RUX@u^i=f?<3;ja*ZK%4 zN(0sAQEgdhhK|v)t~IM`aUPsu$;q;-`g|uqV4x(P=yl&FBby5fWhZtdq$6L&$|mwE zb3_dsfLYqX?bYZzN{<1^k3LCa zd7L%Pb@xNAMsGa(Y^D4tzQ0L0l%u9bMHz^B;`8U`&B>_fx-%uW&%ctP9?KxPv|kSH zUsrYqpAj-en?6O5pKEW7d?Zzotg^^Oz3<{*Z5#ak_9&@6qVVuo$C2*D>$0ABbV9Cv zI<;)rS<%hMnYE@8TFo_AubcGL-8#z~g6-FvKE3tdMkZu-$gw;qge&RreG;#dWsy83 zw(Bv?O{UMzOjqZF@9$lwjg`j|(uxu2h~H`N@@www(H=IH_0I1MEsZr$RY#WFCrRzc z%B_Zc%REtqbDp@}jqsv$OG|2}pR~5LE&VXEFoZiPm3HlsMCYL$bEzsGDoLjD)?2#`ditA&eY09uDvze0MfPET z2;TL3I`6_=&$E+3e}^`Xcx&Xoi?d2mKAOkRlpR}Cxhz^K((>J3n+;ldx+|AgUfX4+ z=zia{x-zkKZWmu&sdf;7mEM$f8xESHB7oBG3Q$6RUUkBOKZ@+!J~zKLjrMeST6IyI z%d(1`H+Ar&_+88Qd@(kL9k>wgxaVy;-GU4um>HIVxp-^uT9+<#pnnT5hS^3jjB_5) zq~~a9S(g(yL}bil!US+7o4-S#(HZ8^p#L_;l0T>B`Tz3%Y6MzXt4SLP0WidqB(XG< zA|q@QZ*H&mTZ&^dBvvUa%Qd+afwo075e$+tjWbe9GG(wyOvv4xv9xTKs}`jVnN=Ez zEZS|fgxboJ3kj5CMvVO~l#H?vOsE7r&9PTdFhH`2R7%@3Sz0MeM%2n`ujTGqjAo5A ztxcw*R3@^tjbj0WW~E~$HkMJM$!V%atjeUKlWc2IS|rv|HpDenZE6ihw3?zTQc+2% zB{m}#*)6k5)>@VfLTP18(i0*|D-x4vViQ(L zsYy4dYSeACY*xme9aj@*u#{U(HWb#vh|L=|nWoLnU6Bo>e|5teTScg;n_nedkwt+; zjWbj%r4fhkO}Ub#B)^At=r$>-C1@)~q>R&9HKsi+$|agnw3(ZKgt}Iek|>)=25K!u zNXknrZ#%h+Rrs638DG%5AN^)8IaPLmp-~T>Kz_I~UkMdXC8ebTmX?<93{WjTQ3y(( zulD6RD-Ww`TPz{;vG)+i;2)&^V$%YAAcw?F*eZIU0D6dufqz#k5adjdbM$Fn*Vo_VHnrsSChgZt5lTR#CI%h<{TQx`X9&cJC^8%iX%F<1sG-=07^K*jM2V`A zygF^Sr7P4*`xh@t>9?uNS`tAFwBw1y8ew3fScIu18fI6NXAOLyQ4r^!2)<@ zWXGI?bMFYCieQJ=iXxZ-B`Dx35-uwJFra`|kXcmxxC)2;@AZEN{4~r_B?0{ZX2#aS zWffnp=n_ClC!w4FAAFDdd47yUdH2Dn6VDf#+u{hZOrR{1sG)*XLU*|9FK`|Ubf?7p+?{PmqalPK~_ zpFcBt9PK zr(wxN+x%^~A%z=UJ6+jvo`^n!`182U-_PQnoz}fta;x`tcI(wgMOs`=tbx#fj?w}C z3mu)^RJ9X31lA^lxg}w?$V7JLo$?@qeR7cJ3zTdwU0zU=Q7fYu_Cf9-ch+9Qlb_c^ z$D%|ub3x---^u}uzP!uR*4Q@k!k?*+Q|Ba3VF%!7El#hao`o4&K6R_M{@y$FXTQr? zn2qK)ojzT7>+$hCIuDlbINgVhoQB1W#+k6}h@^;e8bO(~v<5;lxBK+@Yw{tm^4qpS zDSK1-dbSqPN*WE?^|C6#HL)s^j@*IDGf{N>x!JoGw8pWe-%JK?Pd`VI?3Sdo^_8s; z&UlDSvh+=uk}8j615%(wR|GnZPD-eco_&oIuIZFhC3H=_lOwnC#&ZxGnRAb)`8s)j zO1P6mc6Re$R5i@86!E$cS$92Z`zt8Q)}JWcjnHF5ZcR3z49XPNQD>jeEUWWY)NgI) zF-e;@hh!m6(`w=~cK6CbjLrSnurSTan`qdVNdxz*RC#4Ze8#3`!uV!mlcBuv^?EhVL!affhwLcxb z9i9H1Y_p@&qYHIamsL`l#oD`_NP8b|9(geoQ=a-%tkIvHe~*_Y*YN)yK7aB&0|nEA zUdb`d?dOzdLgBH`Lnc4pn$IC0q}Kk!Yi&(UscPA6@;g~=8=?F@rKp}nAs27r19kV_ z4~Y7Y%VDPjmrOsFB#Lh#5~qm`PBHqkfREyN_bc3G&knsXJPFwcbgx61FmQOgocWyB zV7DMOCJ@+u4p`ZCP(u??fk8(CZ3W&3B8oNc6$4XZgaSoGN*mdqpB5R73sciT#o`PR zW-bhntxvqb_o>waj=L83M&A58ka!xFcMR+hNJB|2loisfRlO&d*8joJ; z&E<@TYIvlQT$pDZYK=t}>lmQ%V-_zhwIzN1oO&UPCg-EWHs3_s>_bFAgYnQnZWzce zug|wr8R!J>M^4L2Z5*R%S-KJQFx}_^&e!lojL2%4m@5_dZSI4G8*+{x>l(4m-)?x@ zT^zqC%`qV_pPp5A-)G7tqxce+ds8Hsd}E7Dz6r``c|mn-QDqUCm#*L?g^Rf*Z#Y`@{G zo6S4Awv2Z(-)!KsyyJ%~e7mz_9}NW^n1rBl$#!H{TuDgyc78qi?n%>r4dCOpb|U5m z?sP`mP&-F#?;f?NO~=UYa@ym`TXZp67#n`Ct7lQjuJrNd*__PoJGlBr2tlCk?^e9c zibUJYdlAqk(`b4lP>?+XwtI+T34xH2j^I4EIJ$4>g!m6h7^guyM`qEjY5wL&5+O6Z zUQ2d*N~)-iW4K;4W-z34IC=TZ6g^u?m2T-v1HjnPF6=uEH(chuKC^l)x7Z+ak-QuZ z5X?&i4+G1%2p$F?Y)3Ba5aH1^0kqXJ?{lFvTy3G~D5i?(o0W_)&4YNi5;IEn_-Qua z*sw@LvqFTf&dURR%!Ppjibv7%k7L!pfWkF!ka=c-m991aSYL-!HQ(eQzi2dvSc}3cqp)azhg?x1 zf3G$i!4Ga7%n+99ID1CjdI~-47)qv;53k^TKVn4v7ks@3RhQXIv4~x(4f)D7?s|Ic z^ZaNQ0yBGtK5PwJF`Xmsu#M*eplPZSX!rh(h<>y`I0mhCjX*oNIK?l1!(poS>FtSE zSD@`EZR|U`tS<)D7%)bspG8pP&4WvMlZ_xxj(tC(QzoF~;zTo5FN|Gn;Jg^S3#tlOHyyg56=uDST zax-nf?Jj9{M5Yk(Yts}N`&}n~=r?b9W^#F$7wJRbRlK2&48gE=>k|MQ?O=2vlcCwP z@@!a@TfjY3IYQqaxNcOreq(fL|EE z@%7xr1lZL{RMj;=P3Ze-P#yli4JnrHY!6~r?WPPe)VV8 z-uU@Z&ryD6s{Q!6r0ttwBeCbtwz{c0Sq@b@VbyKv;6hkxini2_e#t`*(=SyU z!4F;)MK>O%@a6OCk&ZOtouO>Zcz+w|2zKC@)47D@7!R!kl*9ir}5Q#`V zgOXhscN%ueG}PGM31`dPU^Q&yIpxP;eP^{FXccMcJ`gMH!od)@xQK#q6oZA5DCE-J z6cYcQ`T)&yX&;6Dvdy#R4TqR>MqLG@3fu~QR`4&N9J~k$h-uK(nW?afX6MAYSfFVM{(qHYD>YYOl|P-&^B-_1{~+9RT47boD1cCv&Y};YT~#T-gTQ~ z(~X?P#@U`?8NQEgN3|$Feg3F&Ymj4g7<0$aXXN5jX_~du#pOoc_0K4Db7KakmobQ% zE1K_x{+|CEsudmi9#RWTfb%wzkvy5ICUtdSS5*z}_f>0hoC4Eub8_x%#Fj|p6HhrK zMkfAJI&HmVn9Mh=k;I`?$;9d1$4#*02^0;6&QCtP#X$D6 zq{C!`n7oapwO7kk8*1f;E7f>tL9ol&(cj-HmVG>rtTf9vs(`>E;F;*YlQ(4+=F;Up z-p$Q3lWj3(F15?lQIijeb2&MA@{Bu;$E3KGawgok=x7Du5HCS#%q7y)XDT8%Zq>^m zm|<;>#mTTCU}hQE?l8W_rxU3b&y%O8hi7eUX$=Pw&{|oz^6fOfZ4hCh})Wsiz)kM*SHttyngRW>cS^)_E zV?LRd=lKF!e?j|q9}lnV{T$yeGEb#Xrb>#6E2rn%@Oc9D^!{1g^)I@Ezv<2SdFfp` z>%q&fJ84sRam@;SQBZhssVzS4-L&DZ4pm81F^n@v8G`f;R7M1!MfLOpDAgHGD!pVyCD?9j4(1d3@u z!StYGgdCoynnG<&17LcyJ4-fuTfB-5n8UX(Om_%VqaAMb=-GXkwA!6O+flmwK8Ib$D<10Tn$U$QLYLc zCw;xC;{@}RvH>J!U_!p^tyt#O1!;Lwvpv_!F^MwEO$!5FyU^O0qw>{2V-$wY_88%Y zO5}zyFO0@4Y><3VK)IGU<2zU=_>2zBlMS;#mlN!3nZJ72!NVbg+kozkYnE)$OxiP< zps4TKSm}gD>*~TZQ&vSn5)e?=GBxIfveZ+CL$OOh(CcT(jeHpe=yqqY*PmK&u~(;I z=seJAooS0+6FZ&=m^pVrzm_Y76R{-;Yub7S{VN z4%{>e{yoDqD~vmL??=Nlv6G5>iduY*-#*@)7hB=I`tHYjZ=ZFue*UL2P5WxS;yro2 zVkg_KVcKjs1J~B~A!62Z%|$zPM`%5}>NF$Q9L@8iM^AUldh&cL*zMG7Z}VJvv$4oa zdbAdT3JDJ(&==wucDDk%vb4!+(NqPCrKqapNw!MOPi6B8V(~O$)+_PRzI*HwzF#Aj z$xET!Y2lL_k6_ggXB6l?;SXI##&$6#mg9zP@{UC7zj;I8{^uePmy~%yO=-E^jC^Ia z>S_JcGol4Nfr-akT&IJY*dy7Up~XCyoYM75j7XMit`3IaPF9nQVS00U&|`)Wmd5xX@fekdK^m zq0wXLj4imi${y_vq(h8iGZ_*oddlg8B9_qBzyMyEL!O?lI?^*|K0O% ziDc|p##EROlp#%W)>Kxg-9s5`+eUo^)z0Iz4Vm2=4Kux1?J&z!7@(WLY@)2EAr21B zV;a*n#@z$@o;#7;W=99Gj#&RZLAJy(gs`>noslu))_oWsMI+!j zGS()-u^FV=Zyo3_yfK3`=FfAvv8ZSQ#Fl81M)J&q)6*59X9L57!NI22kep4)InnWQ zPYu{`hFH&%+t&>Z=p&yVP4BMWd>uP*Z?aF{T}HgFh#EOVLwSna@z}K8a{VRWw?>Wx zm@8G8+_vF95VtPXN^4^Qgk-`&MrCbw!&#Baq4=C*LGkz=Mu7q&;4#IY5qT3gA$vAc zJweO1cjP%Qyq`jh)##D7In2kCwwT*@97lsqwZXw{p?Nerc{~<1_cg1JH65ySUYd3f z*>GUyIuPiV#Pd|p-g%7i*myamEI(@{=ZrI{)}_9`QkHA8%HwHmfqTYBw>K zwOf^;)LdBmGYa0zwRM{n%#H7<8(resFIlIkE#cC}^%2#r; zc(R;F$T9X)Gtj#Lv!6sggQ1KRjoR!nZAu;xs2mg#LpGRq8k>eVo@=dy_XR1@c>F<1{ybWvMFyx85Eq= zt?F$?R+ZjpjZ(+d$(Ho^>ddVug_5Dk)~+7sPODp})!wF!MBKja?0p-W$J(0RX>BRg zC41G`l()STFPhnJPGnr{-6ZQ#yunlE)0$DOL~C=Eg*S$fv%3*KeHtEj21ZA8Wqm%Ya3Hv`gC`I14rjU#)xl%p0zl%)Np~_rjn(As=@6z>X7@F)K=pwH@VppS8uu9?zZODX~mgYwQsc*yf-xyaPcFpM$OgE zqjqXtOH>yTy%)XIX+BNXwXJUE^B;2gn-p&~lWwbXdemJSD_Y2>mx*b3p(otS?v+-m zN{GpYyUl4^-t$?cqVqLoLXBe9KO}0m5w_s2X3+}Bwa*2rVYq6E$S-{A>a%&8iKSri zQB+)Sd&kWxeMT8`aJ8yngIA_{x6M?J;)>BE)y9#%UGCpjr+c`nm&d%_MvJGZQ*f%) zY2NOrMzP)@??$1gDfWkFsEys_Qn-k%)@7%QGix+HrEHT=6S+QD3^lJg%Q zPY(I)Nj=BB&b#)wPvxqL9>>f+Q1pu7iy*{4P82nbnGQ@5n+&5PiCNaebns)OW~944 zoh|1JOewvC%2$moI&_}jRD--(8FQNtGeq-Pa%raiSSpiuP~@i>ZQCBpi-U4DuwbsE z*<7%z=FHVF+zMEyZBRJacj-0VJiUPU`keE1K8~n0OABE;v(LTd=DDdvEvOU85SUQ)qBZB>c!y6W&zP|aQ_%DvP^`DxK@c3lg(s%I*FmcPG9 zHmt0wo2#9+VF^o;J-M6ZIuRuP>6sSG0Pl%qmP|)3ll>X$mO~^{d9xn1Azkv?0mKAP=_o-dT?9~wcMw4HPCnAqJb)Dsrw#|TWOBxq?4asN+?1B! z`eb@rN``_&S_B}be5g%A3XWhZxHY6e?tm}sfC1*D1wH79{@wxPC4wL???o6OsA7Qh zkLMqUfwB2DE7|*#^RZ&_ab_BSp!;9ddp$@%(X{@kWVR58S=(in*4f9fs9D>NX?%!9 zku}$^X`2d(2|WVEtY#`^Y;UC@B?c*FSY#fr$KHHIO?d{6{>17skrH;Dgc=i0BseBT zAoS6~kp+4@bQTazNJx&o;d#Pe9*)8gOEWedA;)bN-3PhHlMhM<{h{WK{T>6q9S6=r z8i6{KNl8hdkcMOf5Rw?#cEDYp>y8#&TkoK!ZUsN0Ob{H8%q|#sZyX=cOL^opA1phY z8Fnn`hJi{Nog~fo8;hzV&)9!VU+E$FL)>at?Z0v75X|0mFoR_OGo;hSyLtT-AA9q4 z+ziYa&Q@j{>cL+VN%bF8574}0dKnDEDwW#1FJ_2l?d)ThiLCKK(p}k1WO;fM@%sUp zgFYM;=-VC&Cue`6f;v)g@>fH>u~r|D6%9PlP~zkh=f#~2J*3#&D94X+zJ@~+OgsQj z9}pD`hC68x>^qDCp>F5&{H0hRnsGZ0xi|ZrL0;qZAA4ZD-)4Kx@XDF}V~Yhx`~d03 zYv}ww9_;=-zV2Omo~tAIYmb*zzx%DL)$Mzx{Ws^bQoa(yD8^8(sxY6L5`{PEK5r7a ze24qjZlt>3-~OIEXXImSbh!Us+hj@}PGS4*X&C5WT4NS#5F^N@tqhd+ykiq3cXVMa zpB-{_?@_<^zH*~BY|)LA(n@f*Wif?@>EV5=JKWOPrO_xsO1WVf7^jEPgs9W*&qWtk zHe%l$b>Omk7OVWrDCsF<7hHE&Min)&v!I+b+~+l(1Y@S1JECh-EKq~S=#LhP`BP?^ z2|ZBG`gr?yMAO2ZHeokC7F1`IHS)dDsJ?Fm>=;7TzQmWq5T$R}i1LoTm&X1&^vCsa z*K?H+_td$W7Qg)r1%raG7Z(ZiJM-oD$aO>`}NOx_5^VC7#+0GYQ zzm#CVCZ~$&3;caki*dd%s#?IVS&Ranx*^i$gU&^x+9Olo2-DrX@7 zZdUiLNiSNATFHybs*KCG-PJ~rJB=BRNfJnwMEf{8r*6m$IF6eZ@SBM zq9;>#sn)kxPE|hjb+Rrut!r3Pu${TIK?(NcW|R=c(9XyaX43^IOjH*zMng2F$EE?9 zgIcvV+CXW^ae+|LZw|Oya}(?jNAe#l2>Q=qIEYDuC!23^XWV?0WBdXN?KXBU&|(A% z5!g9*<7CyNx%Thd@M9^SqC>%t#DEhdGnav$Y%@?`>hQKZkmB_Bs8xQbJnb$}Uj-OF zGV@UxuD={dDZ4Ibjq7}J`o+gal!utDty ziE%ufoCsEN897E*u-e=pP+1w3Eu0X%%Kf9&4mLf8kQ&{>;;$pYG2w_fA)P68xUgM^ zQ%5PngiJ8ok_+I76F!bvzM=6^?aeCRO(im|XKH)z-+sTV*;-trIwUXrw-FzR-thbJX*3B(1-iM`)jjEdw1IM_LpOiSH=+@d%jx}j6P%9EWr_G77iUVifE+&(*_{(<=7?WNG75VaB4vHMo!hP9&A zYBi$VHSuqqEAsa+ge%wS)J_49t%i%9C)cD*qs}Au;2Y@-_iYV`^2ZB zH1pqcpH_wT3FvBM)5%Y%E84b3r^OVwWlr!bmnLr;#}KcwxK+- zJ2S#Snw{1WIyn4ry6QV1NiRZ7X!xp8wOQ(1k61D^Iz-N=fg|_cq~Pqm-?iUqBfM|G zoYl?}3@;U=)P=~Wi9|@OiLm&;gO9Q$u}T_>-tm}fx~NW2hwWE;UBYL;E2>wd$G0A% zOTYu{JT>Nbw{29i_XY}G15I^l2}C}Vu@Vb#z=S`80$Sc!TnjtlO-oy7^t{)7y8GWZ z8O@L9hV1#sQtBkH?(PEQ{RbHZd&2A^eC=e0JvG|>)g|Q>QjgPi&&Poh)NeurV&6ID z_p$dO%0>s`ysaWfK;dQH6M=29e%Xz*SKGb9@8oFh_LPX2fh>9)IIN(FC zkMrijtcYO#yNJZ=?YJ%w`qU+dL#gP_XwEynlhcojrVz%sG#yJ0rbJCl6-dyJBSlw$ zZ>7gO=vG}>@tCMqrazx^_E}1Pj-{YeSH#I}8I5NHaekp4p-$UE#Rondk_xgcVpX&pINjZGjM~IWrzg)u+++@LG|+! z?B0RIHuD-OpCaz&f!VU<013n9eE+4XOH=nIC4vWY?^nrS`Cb^z-HS_KBwiFdsw9EE zSO(Gfv(S7`(>N+AR(0to$coTL(58Ix;C9uT+V?wbEKQH@9g z`aUaaAR$-1jS4@kBVk2OjQu?As24DF_&Iw6`Xpdc_PE5A$DvB+9Qk)npqwC`{)&xr z!`eD+jJ_rVNDDHjgBos;*V;y4NQ)6ef+DIv8u&v8W|VdX&<#v0F<4Yc?peGc3!zy^ zNl8)7-~&a#A;BSB`}H6X(LsLtS&spgqa0x$T9;H%&`#M(0k@cqqNv=aYh)wIw)$g2 zx4zV$9wbLAp4X8gv-}a5ViO5pLkDE3Aj!Ml71XoG)2u`|PZ32~y2?S1nSTQjAaQ^A zdNn-0#&?8T9cW}^i8Kw%W3t7;3XQe_m9Mdq7j$5Ch8((Kd z_o=9hL#AgeC^)${offxC+}F)B2`Cc%3C%e>rg^$ zsP1mL78cCc4VihCX@Gu>WgnydH}KWzJB^+{n;NiPt`_h7kFG|kQ}wEd`zuG54x3sk zMTN6uT%l+8ZQc9TIlZcXO@$!JvQ<^~KYMr? zn^$A0?RMytYaljwStF(mLS*PgWzP+(+|Rf0RIvui^k2WS6k+VZ88Sj%+MJX? zKiy`gC+r(DQH5C~GL#h$qGKrqVihV(3I695-r#+ahwDqgtyxi# z+&GR(+uph?8$Vdu3c)EI=*9x}z%Zu)pv#d6p{={pm|!WQ0dmkJ13XOlE6L({e#*(V zf7QJ#4YtGOtw8jA`U|i_&#Wa?a>CqD3?#Okr1}Kt-D3P_J`1eHXolwv7oUHGT$n^tmk0BOuE;msZMNkN0;7s87 zPv@*7;LU^mD3DQx`31@mxSk~YyXRs}faQ_;yBpK%#1OU@3TsC&3}PD*16vCXa@VBy zYxqq6g3KsU$PFbtw1=DrH`a2ODn(uqhj`tzfjPnc?B0$E0&eR&$83RE`DvhVDaR0w zN6tcpc-zFZ+O;_HO#_$a}gE-D|bN1?e``wtyJ@Z+@oX|_`%Df?v z0ycW$OS5bD=C%#Oww(NR3uwSw$^P%{6YY_?#NIuPwpUV06EQpW{<-;$&y+e&do;6q zo?zPP6uDELNJ4Mzw)nA49Tn5)>>1?75v=VJ*`A&v;k3R*QF2WNBdc^u>-WJ3HIZx|*3at>A9Ox)dOxFunZ0Kh0Ws4_zJS+mf-qNSTZLI*W%VBq7YA2nNOCE=&K%apAOxS#{gj1gnq4&ZEBZpeO$>?8XugLm zE7FcDtIcql(v&YSQdv>F4bprOHj3(2%ux0&jQwJFb<{!rnc0ETt6`CjJK}DY9d9Wys{>$BJmH7K6q1( zKU+>07=(esqZxRS2L|0wOxM?!%{o4d6QS0}(cW&rifo{FboPExIE=rZi9<8dwjKzj zAbZcPYie>hD=YQ-u3`g{Gagw}bNP+wy1JGE(Y*AoGQunM0Tbuj{q0!e(X#h{i1;Y0u=N!C~$0< zN45>9|AuQOpN?B+q=S_X=HyI?FlC+;B%uNg4w0wK>-m#P0_#GQNV-2HHWMc=8!>FM z^t$cH4BcRFkYfw}H)0$w3P=U+Aea^^I#Mw?Z7El7-^VNumIT(dltw^>;V(ukH@JAT zdvJ83G{c|;m_akOYSa*ag{_w{cMx25&(Vo&7T-02*;uqg^6IM0kk!1@2x*7_0O-k6 zV=D{?m;t4MV~Iq7JkTJ2g7LZ3QkwyDVgNL>ER+B}Bw@t&m#jq&DW|)(13bxj(YSne#w9$T8Jjwas)Y9ymW5lI7UkqH6pA9q6WkCVT6n$ZObqdOISfw(>UEj9Z`^2N?p8Cl@M3xGjqc}LZ zKfVDdLRF(XQxISF`W{@f?vxOHmD7yU7n*o*ykIv3=-|={qiTgxz+~<1M`GQi`j`Wl)P2FY662<6VwRhZvJUG$~Y){Whotg|Ae5F+STT)kSei-+%9zKld^B;UP z7j=hT)oAEL(!|)=w$@{KYJAr8Mu>yCx^^f3!?NoRf2MPeILLW1KB95HHG)Z}YIHCLM1CjO7 z59VVwN|=@3nI$c_NGY0Bo5$yi@T8i`7FTQYe5s7-WwLrwqrEC7x@|*T8T%SwCS;$2 z1ZGC8N7ncIVlv)JVO}F-Y)~!L@S_*tPh--RKgN}AsBlzFjrGqleoZ4v>G%Pbh7s4ZQLr6-7M#2I`Ewu|f~oj2u{kp`3IgMt$qgRZ_MIMP$0z8_@4p~S}0OU%}AN3GV6{ zV+Ty6%pg5Ilt=@)QyuDymu2@C4DKlwyoQ{mcFd-xA~RSs~`T z**gbGQt^>tL{O_P(g8f3Xuy$5+T%Zc`NDT|MU|o`C1EU6?FclfP9G{MRAYRwWyPdlgiRM%pA*$j~?-3p~IZ6qRA6Arkj*6Xm1yqqx=@S4mgp z$e{m3Qz8fpk58!pVj~!FFz1j_NXOhJZg`^_%gVxy(85MZ;DJRE(>5c+}51~a@VZIVp4NxZ6S{A&~xg4rk^gf_HW=JLN|%mOK~0EMe_}Ct5Zy< zm=8p*L9gU=Qq`%Jt7}OFaawTmDdH;T;CR?R{dZAQG=f=kgJA@xqEMt-GD@mWqtukC zkAdKG$~aEL=5mBu7O zr(^$W>C~t|jb2RwGoBwa?Ba&#YbblW#w-KI&)Ujhs-q^6!I>@1;N(bXqISS_wfU-M zGL1}^{<&5k=|;_5@{87p1i-u^B6bqZ!vwa=qsalt0PFWXs5C z)R+k-toT`MRP=7b;8s}f&(ACV$XF8zN#~*P(zVl5ad$9la+ zL*WE#b#>G!*QZfV`!23Bh$HBBgbV|Ul*mfpA)jZwI2Xgp^M+Vo&4Yz`Np%iGVBJLfN@0!6Bk zPs(j|5o6_Q%LdUNkti%ohgpJ6>mI9IixE*UF3G7wqu4Cx65vqvNa1Mc3}zZ;;8B^z zW_DSDhs1)gs)1|#Nxsr#+)EKZ&_$OXGpAA@ASm77Mc3g;2P#!oeF1-5bexf^UV>#U zNmHGm-q+yoIe2DO?L5r0f-Whag%8Nn(&72S7%qR;>s2WIrUnj3SB*KeQ?xfcy?TFi zl0I7D_Pd}I{Rgor);3f))&QH8#G;R&jDy(_^at(_(|_%fsZaT;K_DZ}A>iA0gJHxr+ahg_e;rOz5<^84!`Luo z7G**`g~Vt;0hCKl5E*;L#|%-T!gkS6-VY5bNxwaak61=Cf#AnEo+QCAxIgcTq?mm} zcew!@rQZ!0GJ9iTFgvnVP9TPURg?s%(NA&$-v#eA^*5?4A^)DqiCZU3?sOD1&7KEu zaF&_ZaUBX_iN(O87vUw6oE$IssEnfzt4r&3ok-Zm zIZKIcNV0^Ck{#eU*U+KBHk+zF?AcWYR-Y| z)1Zko46FkOeNMh0_a)eZy?`YAo8mj7O-X3U&)l#&I3tu#Ncyqz_0X_iDj}*$y-&|^ z+y1OD1+2%YsxN5BUuc5BtoN5%ke-#Q0m%o$xpm(m{Z@gd zf7waL+z-iieR%CB*p@Yq(EIL>zQHi9ws5wAFer>AX4S%U$CNT3_WDtKoxsA%vrY9Fd~uVGkv|8R<-{3sB~}3xDrmaP5tht?yTt}LB`%b z{)?J8L!Qn`NICi2vlsXAqL*67jBQI~S3N=61FDyO*g7{(PAWr2Rl-fK(b|bTovdnq z&Z&bep7+tcVz-XkxySsD6K+1m49%R4_Lw8%iKkoyn<6-tz+thhRS&PcqH)Q>Aotw! z;xh@|Trviz5t`eu`Di{5_t zcPcMJ^hYfKkrg%s;3KrbV24P>1+K5ABKHI?s1HD3Wk3K}X+P-efhus_R67fj0}GUt zZauJaruIHd7wjW+eNw_%r;mYPVMJky#Y%15P-KN9aV`bx&+VJjhfzx7p-LUw>BWv@ z&d@BSSx99hl)ES=_x@Xdz&%td84+Dcb;0ZBZ&?&FO776ZW3$ClVd0w1Y=<7zx{S$o zBN;ex(lK%=**I?A!ERgTRjjN2zB<^8U8mjp`Xh(qCvkPcQ-q|YFr;G68w3Thm2NH? zm(iAgfF06mm@aGydBwt;t4o5D?Gn?eF)jFeO-QKxYf@{Zi9l0_H@?b0XE43&+y-cA zct5$#5xlhAdr{#R6x<22$t{eoOfg=|J|MoKl4aF=9LJeW)VvurXEix`%eDF#7%lkw1WZZkIrrlsz>f^dBiK9^wTRthit3zk7V zS(II17mgb0?>fWcd4FNWA-)iwBMVae(R@^aZk8F=1oW%ckp9(Fs6?_*oPMrZDOelR zr#q}!&6dg0 zSU%*)vN4!CX562Hg&1c0nLc|G|e_*WE{k8V!SB| zl90#YFllyO+%z|aM9be3f#0dBO_*Og5y+%1H$CR|5gi|oWXSl zi-SaeAbfmD9a^w-vItaGxYe{DxnH1PP{YlCf2ggcqGAI@PCYM4eIP0vGIDXnv&1^P zuWx@9AhTmi?rE?Rr;^+{l^OzX#WSYkb2=c2)WD`;6}6s6Tj2 zx)lkt{&ldiZ^r8*MhqL=hKBMMt^T2Ohj<(YSCA+$luK0dHF&dYg<6rMHjank;h8Vw zu$J??C?tz94_1Ivn~Ttbo33N&z7A?}`V_^a|HuN36Eao^CF!N`9qbkfL$TrQvf8AW ztYO+a^d0O?%xI_a{|r+$1WD)R0>jUGUY!a`iNEtx zPcjZ>`O1404eJs0WSDez27DgE2DzP$`UgXVDb?bFf39shhh*!tTny}^?E5M5O#G); zQX!wM6~=hYj5i$KB0y3K=Y!*QZ+hDq$RK|!XYt0H{l*zc5Z>#Z&i1n!=+?{?yU)UJy${*wUO!s(lU0 zEWE6+NP`II$QU$MDzGJ?0tvWdB|Utuw5YM4OGH5l#=b^)uw$ld9HC55rgKYgih%+6 zosTf#kg&!bdQM(NJLba&hNF(TT$xL>odUFbt<2M$5Gb)^3JgnO+axddsEZrgfp>jf zODOR{3l~J@pNTMu1o7hCJ~3~`L351jEJk^`)6|#2p3P`)PWPF-H`ZX7!40Rj5$d!O zS{Ben9_Az6Ev4yBe_KxdVV5sf%Ucd*F%V#P5&>8VmFNL*B%4&~YM2^fYf?OD1i&xm zNeygVSWyx@k<$Q3@FgxZuJJ|3 zzQPy0L$0U5ySLD>BWr#^UqSny^P_YW=^hg7#l?!oOqtlVCNmw~eXBoEjE7Mp<7hn5 zXpNNRC{}kX>Ir^CoNzg+39rfr&T)hhLh(qP)NlS2KvJX(*~pvJ$!{R}UTmLS zPqn6!*eNp%)SmSDrQoJ+L77dT#1NqwAM1h-tH>C_$o9!0mIHlBXk$go1;H~Q_fKdJI zGS||oSKxg3;Fq!Y%Rv>nwRUS%6=hK;5dg>J)fJp(ZwO_$>9*26T_tZ_K1A((f+b|& z2s5@Sy8JgiYVc}^x-mK{*$s&m4e6_;4ul^xxMZT8;C+Ce*a&SAMr=#?t>7w5&5x1C za+6(Bn*4G0ys5)~EMnnhBr42V{!)IlXTQ;!|4x4d@!sq{f<$G+ud~bh?!L^P9xhY= za7qthYQFR9jQIn~?_^S=YC2Ck4$P-i**6{Sgo?HbLgwITrE*H0p zEr$@;mPch5pz}&!3CO)dSLL*Fuhl|!R_vP00$Fa`|HRprXO%l={mK0&Y|5siUYdYf zOJIc%HE(aSpR=5Xk+i@6? z&WCZx^VEC)je702X1rJQ#;x@~09%-|L+SpR1}swsioSh`H(-f|o6De`U}X!>1_u9x zn^2*d{5iESL~d{<*TZcY;27&~qfuGQWIw!k;f08kUnE#jmA%h19<^z4qC4#}Xkj2k z>dfOh%AXNIUG{hQ_|~JpS*lO1*BT+XD)6SU#_RP<#o{vPqYdn&Ntt(%t09-m24?Qp z?>T5uaLaxZ)+k2LWRxA#P(DT5<`Nqs5?gGta%zR&P*$FZIryf41nx|(4OdUgNoqEr zQ~Z#&=B!Kbi&v4JyV3%!hcDIbqpg2+t;cdriB9kIt6zxW8aTiTN3@trVnUl|US3%O z$$9wS*S*~cz;oOao}sRH%ec%3E@9GA&h+*wIik8@&-2?tA|H7B?M5_GVaQyDJ%m6uhV9!(1vowu0tZ8SB1 z(4Bx?Lmv_h2Vr?D-}?AY>$v8GJF1XST&loJIS}`rg>|tImSA0UZZ%f%3e9=Ebw2m= zhN`wh84&{Z3g!Rfe>~gERfNP|Y-;AYxxLo$&I)7p(>-g4c|h%+aT3(!xq-Hn?_m!y z)OF?()6(7vF&TXDc;ugFskdk;nUIR#dQLAO?$NAyC%b0*JH5G*GEX&Lk?{8?d)=%} z)GCB2|EX(k1;*je&i9Rw#X24ohuXh^wiq)n4nzh-n~37q$mA;hq^mcwc!hY;w&w1j zacfP$o+hVXo?}~i$K?ghVBp%JqC4-lZIlKUf?W>nvQNMp&?6J}Q zL*W?RIK)2{as!&F%i_K3IMyp$GyBr-1zaaUFgBwyk8AU1x7$y7v3N=OjWUXG)eE_u5m^})#h%Z^`*V#*6SUG(WiwVGo^#RF&8!?By+^T z=rlbq*-pCVpO!DCxXc%3OsCZOYMm$RQA!D9QDMY2i|uoy?}mF zWv};%DgJ7X-GJw@OE`pNuIuzwFtH)+*&htUf*-Bk7i8JvR=!LRHG&^{n-u}p=a8?y zFOh2xNrkW#+Z-g1a#=WoOJDz?*n9~K<-(DYR&RQ})Mt3QGp79A-JuWx0qLRSp}p6X z;Z2K%f$~1`pI&IER^4Df+&`XJ5MZK#B>h1Rwj}$X5_|!ntgKk5BYq{9uMp8N*^Zex z6)B)%7zWlGM<`;cA}q>Gwd~H?B+6t-+Rxl>#o@uOb0iz!8NuahmnD4$Wb9Oz3_C)A zWX)5)V~s$np)V9I@pni1?lVC;YQxJk6y(OGN`%=uhB8cym<1T|-DAupNf{SHM6{53 zjHsxdj%FDl&`-!s?3j1pH>NB%FHsMc0Ek})FIF8slN*zJ`B4&rd*))@?odA?(=&yQRWV_=g z)B}e;`=KiGu}BYj&jYwao6|xNr@z^ftcDcjFG0JSzkMFOH^-0ZagH3Qg<@wAbHFj< z7jK@nn%uV@S)EgV#{EAws5`c;*KrqS2IS=Ve?+^#x}64^VLKWL7x9NdGN{rJI|RdX z?O077c(Q$cF{Uok@x85Q!~eb6E{@6_EDioOn#O%|K6$UOf9~Js3DGlNDea5(X&~*8+!uzHnQ@r&4_KyR>5$BG&Pe1>h%<^DJ#qsM#riP-?ypB5x*gcO9TeF4L!8)2lx-IMtsr;pvk| zi&2p97oE06h@6aIAl#AlWXcWsru)C+w}WR0(|dN?EN3JD_$ygCf1-q3qzN4hRHB9m zsN$Au^tk`8o^`dbK-t$$#63=8$USjjTX-a=tX6odr-!d-@Z;8%sCq2L4P6ow&1FFE zXD=>{!9u|{Iz=E@5)=Xy{I+<2Prn>a+La)a^wwoI!Ij~BU+j2rCa0d3tO#>=6>T+T z=}!($U45(}t9t%M`>ko1)R?|hiHN@qxf?Eo_wm%yE)7CaQ2AlSq`|?e05SB|B&8Co zHxh$aZ|8f*3WOdYqMf17^qY{_4ybNfeGQS0Xim@|fho|PM){9gGSS6vqTUhV>pvgB zS)YX|z-xb;u!nUyW`WyS?v6q?YA5xB;cC!#UK4Zis6;zXPpl9-Hw9R3a3K z^W^;CU`E_Zm}W#?K2N2qIR66RjKo;=QE+q1UDX%UaLmFb#PgMo3l$GVm`f=L4jCRz zi}qsaY$6I$v#-c-Gdqb7oHT$k5G#_E`N96V*YC5ZQ(RqLs(=M{Lt5#2Ibk2^08?C8#dr0RT<9I(uuJnF5=(TJ6t{TD>=;ylSmW;#l4Wq+nY#@G&+_f zDnWolS&{2hs)x`%p2~lOXK)n|JGD*u<8e1ELkznKYMGX`6%Q=a3<7EOba9-6w?%0M z=^$@&m$WkRpXj2bQwLGx6lb|1G#}ZRwpSa8 zylwV_a7Hsbl98i(2OFdHagK~m+oMVu_3+#RlG8IAIZ~q5iffyqs|&YhlfCb{!XCIn zs2Z}%(l#n){Vz>0|A_G#Woh?)tc1&^^tLwZEteoa+7Jb_=!HnMTm<5)ahRvJgP@=| z@0aRD-b`BgY({iSK8SI{5ViUdUUT39;o%xXRDY-xz$a@Ab2#?V~2#6DdeWRl(V**(tmk z{=(TU`hGSmqec11zMAH|&DbJHBH2#p-}|cc$5y{&gYYqQTXtf2{EG@^+LCf`QWNqK zkba%47Bi{u-qVJ7PIl8XgF=R}vyDPMI;1dHa2@!Qaw){>H+4i$w>!WyKZW~p43G|9 zRCy8>6s4ThDdq1jxEH#DHx*j9ja>MQ`?u=Tg8wix1WLcJVI(t(_5{>t_Fd zi4XWw>)Emj0{l=c7f)fGYV03Ee1B%c~hC`6hxaOMJ zH`x#3cFLH-hpU?Rmww=v!p=9h-65y&thP~Mp_(tC^Uj%{ReC!$oZ5hDn36-#Cllq` zox(ZbqwL{)0dhkLXj3|eh1(U%LI`gG*GNqF9jYF!9oy(tIttgX zLYnyTk1-v~djPpy;F9P+J;k%m!j`?Q3`;L9m=48*&;9c7+zk-ZP)$dXsYnxbNrXRxAP%edj=+AF;S0P-f7j@K?bFM12GQD z$Ky7_ee3&0GaL(^1*?TSE2#o=4j}(^&LZEgYRu}`7%4H!PVH6<&@D~Thvu&6LUeRV zptQ!)!dm|L_;;#a;>oo9X+?(enzq{Y_c&WWrspbIqc~YHpSp=v9dva z1|Bnbdl2|``-N-|Gpl~#)s_%3CM(w9rUQru!=IZGfvSCnzczN%=J$Ua@w|5%+M0TK z8xkfhP8FD0<1Y4*HkUtFrVdux3kZ+hBaoFl#_e;{X{_sIVGcmvdiQOgz1)*5qyIFi zl+)r%;m~-aP&)snuw#D=FHs$5 z_t84mX;!&We3s8{hg^ufXqhrNk6Jnyp0|1Z^UUD3*_xjrHz?uxBBb#`e|pu*%oYV` zg*K}E;CL<;>Kjv)e_3}5N4144{o&Y}W20n2{FQ0v^5Xwn-xGzdYlzY#5bdK% z*I{m%d`Hj+mm-K(UCE#S>$c~X$T@J;zgSFE7fF8j7lz~NYbR}01mYgRytvo82K9(s z9u4>{yYz&3{4{~qY(&{ zx74u>f_F*?}|9-J909_5(u zMZ0|B0lHy?&{jiZCG*^oo*0z z#i!nlg<}@yEWRq*%Y$ku{5=6VF6{Otp&8D5Pd3%o!AT_W_S!XY{Z*PW`Tu`~5dMF5 zivGU^SK*pm>w1)Q9;IUN#>fD$Md&fgRtqGA;f^YldV>%_87k~fC8@?nu5K2iI9T!58m)zZ|s^T<_|(Bek9hu0k2 z6gYIoc-QMoF!RDyi%+J3TIw`?xjv!Ti z!ibvBgISNdrF)j<1)c1`ehRdy<9hT(XXa(_6er9W|7)9Ut8r!i0zLOYq> z|0*nprHyssl=`7Hpdx&|uTz^8{I?6R<)}Sg1zi493 zhn3CqR{#5SMUH+Z+XQaqzTDc~XC1xl^bZ~Si1jeiv2f8U#Q9(H1W8c4!}P@#oYAsv z1UK79Nf)jY+m!{gCFP0x0XOn0P|6)t;U}rO%f*I2(4*;gkh!C-KYd=(`ygN#xS!m9 z{SA(4RY2_9%vIj)zPNn;A^4-ulb<^-XUpy%HUgsV{GbS7yYybL9Q#wfG`}exr zotKNDKSZR5XansblA{otjc`5F!oiO^aE!(j(L;LR*l_XMEaBv^VEdL zIfsfLX|+QP%+gSy?|H4>&aYD~LTLM%q?jp7-Y-Bhhoi};`AbI1GLsK z>1wrRBKEZECEA!~soCWo%CA8Ou-CV3VS`;AY^1mLa86jORjdc(0RG}ym-*K?SN zTM
  1. 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 z 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 literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/007-scsi_add_remove_single.bz2 b/obsolete-buildroot/sources/kernel-patches/007-scsi_add_remove_single.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0d2ee20a933b68c35b7a9e0605c10689c616d6e5 GIT binary patch literal 2990 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 literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/009-always-inline.bz2 b/obsolete-buildroot/sources/kernel-patches/009-always-inline.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0838fedd6d813c611347f3140bc03e4b6f1e6596 GIT binary patch literal 468 zcmV;_0W1DOT4*^jL0KkKS@yEVW&i*~Uw}d|NPquxPUqS{zwh7SKmn%?&A^mI)MY)7r^T|fN2t8f_K9kgQMFh_K}!_PQ1-OZJ-qRQ>b5Lb z0~2rMdgQ-m>oHw{50y$B_fG8Zrx=S!XAGeb%Un>&Mj498VhP(l4^rwdlx8tgNswy< zWh7{GY`h@dP~qO|qd1CGCJ$-mB3>zS)K!3$8gJMxD?7PObNGqc;m;wQ zNtpE(u^i-(5g5i0V%4A%7j#+~ES8jZd`Le+4Kswymx}1BW)>~-& zgN8fzt!lJw}0`&;S4c{CZFo zKX9c%&*{i$R%UoSX0vu`(Pdu9G}*r+pqZX?pm*I4OqAsJ)w>QV;vl-6d<@oD_RQ=D zCR#->P~lmO05rg_YM~>BRiT~`GfqFbuj+n@*Mo&9-UE3Eh}LLYVd9Xr($>`qL>Mdq zP%zIdD_Y;3$CC2fWoX~2XVHkV;5dje#=0(9v4CMis{ImDW!73dE0tQJ=3Aty3SK&8 z$B6@HF2vxVg?K@duL1i<#wy!pov!ytqf?_6?2(5Fkzl~A2GZ_ySV){dBd8m=xlky>ksY0mK2INf-{fpEng2(onoCZS4&`K>wg@cUloldKn4Fn))9J5*Go zh4eDRuSQ5j>4%VMukO{w=LQ}}6oLo=@I0joJR0SwhjP6PG(w#kZXICqks)632_R$| z?JR7o!O56ja_6%{q_14qB)lCTjOi>}H^|mZ&5xGK#c!@qif{$hsR+o`#|pe*%Yqo} z(-MNWnWK6v&5>@LnsHyXy4nFas7r&y$ilqZ$kH-QZ$oecUz1 z(@JMrmS+QQkxVNb(9scCM51ksW=%2gum9FSFabEw7!3db4FCWD z00Aner1dn(jZHLYFpV_PpwMZi6F`bo@gpWiq)b%Yf^u;#k zVzjGRZt>YU+?~zF-JWAUL_LdJf};~7)K!%0p?hGxOl0NMnJK(Y7Z+(eq0Z5(w>d3wg+EOv#@?asGTt-h|ss#GbH0P?%`~ bqlSitRXYy2Ian*O|BJaIoG3^Od7Ehf)(Do& literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/017-printk.bz2 b/obsolete-buildroot/sources/kernel-patches/017-printk.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..da99976164f5ca79e6e7c6c82e2f867b65cd3bb4 GIT binary patch literal 336 zcmV-W0k8f-T4*^jL0KkKSv0~FzyJU;-+)3eNPqu*Kp+qRzwh2~FabJ}VX2`{CWvJ6 zWi)6RG&E=pq$xBF05kvq02vGtrX(7k6+cw+gHIv=GCf1oG<^wWO*b>_o_ay)G(D6& zHGkSv?xlL*o5Y{L6Tcy7r|@-dht+~6o<&le{fFR<#{ovMF3WeJ5u5JE&uMjk?=3UC-!6U`rBnvh}~H%2^1kCADdj1LiZq0#rB z7Rat63X-;=YqZw@&T#_~9@$!ve|=N_gkVIrQ-U1oL!N?*t^+0-U`Z285wK=N<|PV@ z*UpGYS`5nN6}{F3ZgNG`PIeG6M+k$YP0@jE*Wi`6WL%iBNx^KIRC=aOZ^vXWAn6T* iO&68X(f2w#8HGY{UVu`Cg1}c)XcuxtI8cx@!W6(uK#f`e literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/018-slab-loop-init.bz2 b/obsolete-buildroot/sources/kernel-patches/018-slab-loop-init.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..dfba2bae58d0c22486b5e3b319ebd60482d2065e GIT binary patch literal 268 zcmV+n0rUPsT4*^jL0KkKS)USqB>(^~-+%%zK!5-LYUKa`yYHUTFaXwIN=c%6j7_PK z&;Shp^#DB})CitUA%w|^kYvPqni!b?N~!*)rjtjg8fXEa0000w5KBS=mShrnR!|f8 z=2#;c2J;Du@LIS|G#|KPOsHl;qeFDXbd-{+ev*M^G6R{KI)mb;<*s98Bx0R3$NA6BS?E_XaE2J02&Sr8Z-?CfXRpqjSPSQ(@cN>1_%HoB!VWUqx980YDV=>)gDvS z)6~h~Kr}SdLuv=89;SfVLFog7MvVhOpfX|uBSRnnG}9me0fGPt5feZ{WW)eKLN<(u z8W?E?nrPF~0iZo5OKNGL>2L}0=Y9wNDN4|nB_NrCX-Nr~r2RF9eHuUEb>&0pK9Rzo zf6_ZrmTb;bl3IxZWFw4m5RyTTsi@)^1nLe9Y$=SYil~AqvAvD%E-m?gUjp#a=3SPd zdzOR$VUV<2QvQob2r3FL_pR~X7x9@8lm zMIrEi+?!30dYPXdybO&DGHi5wYZ;Fo*^pwUj#(U0o(|l&&BbNW*J84@VS>DC@u9zV(Y%yMhXHkTR0QBZ!8{ z^H5h1*rs(Du$%K@?Nd+>SmA1FNo!p^l_=Uo!f-=Plz4I*mjb4;;!|6gjbDE3tQ9k* z9>B&!EHh=t(K0hLO|j1@#DXVpCo_yXvdZHO%YMq_?%&Dp8v?M~YvK!~m{6#>O{?c( zqlEfKjqFXLj))sh{dy=LSefKz^_9&3iJj6knbjHWU1N62IY%t#fed3{5(E(voSg7k zQ;Pvq6mk~>I?rC1sK|TM8<09>i{AAbRxIHMYQRG=#8aQpx2bjZ|C@C$wru!FOE#sC z-+5;=s@$nowXKF2SoB!FRoXz<`r?l>4hFmpu{6+oNdjKT#xt;#l#-Skc4rd)S0 zt83Iy+ir{G)wb7;y(gT}j7y0^A^X$FMUu$!RxaXrgIJH9qupS2 zwM8fcwvvv=F1lK|x!f zb=@dx#m7nY5Fn=Svmj-{;=KblpE3UJ0S1D1EKso|ARu%yfcXd&O{WyBU~D*GGie7Y z$R8c|ti=J59D`!WT8~&7i-lwZHUSGp{y>eeU}zO8VzW32j0h>1R0%!f=hkwGi$d{2 zMhPGFYZ}-T7A9I*En{O)?_$6YurDTcmN*QOL8Qm-GPCd90k0&w6zCWQ|$=v2D~vMuH;^v zfdu|>S`zw~=*3^4G_*b|Vl=QS)yq}&UFNi)wH0KLhM6G*sSP!Jt4#|kS!+{^fvrPLNlWn!JvnrHj->LA=Syk zNpBxDkW*iQEf^*?11YE}k#;87%)4SqV6ewW2__ma?CCuO%x#2 ze)oz?Ab)VDUc+H4#T!m!$clK=SeYT20UNhCMnMYf)U#7mDy!*Bzcy=FGebVY`oUWU zCO5-#E+|$BZ05GxW-~6VFqMP7&sP%+N?u^q#y1qma^;smu9m>47+1G`dFehDpGe*~`>j`5(q zSeUyxdmtG!GrTc|9h-&Js8n?)aCRF5gaL_=R|po?jY$JB%B*m!dEjLr*!ZJhVTp`F z^K@v4c@t+3ZZ%~F#y%0o$Lk5CKy6CJ^yf=(ng!g$$4!hZ_YE_XW44na7am*^C~4BV zJ3?j|4o$lv48mJC?i0Wv;ZUcv5M1mjy>JHG$*VDioYzHQH@-1Bl14jr!7YXn7 zLW1@drA%_XCV$T z^fHX>1(S$mC5gI^e^^x`dm1Wo_qQ%4Nt{lkiyjsQK?hT=;phioZxwSb?OKNL8Y2d_ zwwUZm3BJ!Q{CxJh^XQ`*!ilh}B`AE=B~p#u;Y%hrEfC7N9TOqmHA0L`he6b!P$vq) zkwXU5A)~Nc0q$*#q@GBl+ye|)CdSq66jKHxIy!hQ@ENZK66Z02q+ifl`>CI1%gSMM zp5=V^$yzrMN;-hdVCvP%8csmbI~25_RY+>&Cg-{$)*xZ)3BMH{Y7tW6~>*3JaU z+1g{mHKpim?rra};2S}()|@#qUf~vpRS?1;)Rb~%_p^r)wBveR_ldCZv16|zQHfT; zjLs#r5=7-QYX&c(UD7s=hNKErV@e_!0NQB{1dax$gDi1f@G7y*9qg1ckf|htX$&h+ z>`;)aB8E~eF)J}}$rVU3^V)L@9clO_KOuo+lELMyT5}YHlGGnwrm0C=w%WymW(mWR zN!Z`PNu1A+R3xfUtXp7oz}c94fUwfZDv^MoAS>jNVI^V8ASr1D#1*k|zXj2{xk3JDKTCCN=tp_j=&!VD9VjShYj{7ji{7P>>r1sD%NG5F-Ep literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/042-loopfixes.patch.bz2 b/obsolete-buildroot/sources/kernel-patches/042-loopfixes.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..456ee6145af3b5161ac8329f174f4422017360ec GIT binary patch literal 640 zcmV-`0)PENT4*^jL0KkKSu}j=A^-tH|9}KMi~wQ(@9S(NY>3tWuT>r z6_CUxnn-O3afrwzL?ms5Pcg;vah&TnEW8YEfyP_!AWL|7#%U;8be~nC%)oMuxSEa6 zx+088Nokq|ca$Zewk_N+7R+lr+L$p`LFt*xi?8vEVbU)l(rhY|h*B#OXG;$3J{V$p z7e&?(PuOu*-U!ofiU@|p@}1zO(CG@gQ+TX5MmTj0WTM6L1)MavvN4UkS<5?TQB>E| z%Tx@LWe*~_7zE!)lA}&F&k>Qunx!T(D(FWhC^e~^!&On}RZ9+yqpM#YGR_Dsw5OkH zCbe>z{7D`Y&`dDL_&pt~gMu5>S}Ih8!M!S(zp0p^ z>kd5;`*6;3KGor)D~L4b7u+gRrn+e_QmB#UC79F}6cQpAnAwgA3&u4oD;@*;0z&n| z8N?+qROU!ISg^U#aiq48PQGM>FyQEsX_=U6i_l65{7m`o6m;N>S0@}jaT$+8K^(W=cT$y=laWj6$dsAO9R1rv{$9I^d(7$D-z a5f-pw30OWMA$$3s;_gVN3K9m7okT#Z7aD8; literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/044-streaming_io.bz2 b/obsolete-buildroot/sources/kernel-patches/044-streaming_io.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4f453e18204c88e3d1efebe9639151dc00d2eeaa GIT binary patch literal 1743 zcmV;=1~Bzqh9(CZGGt*G zfMGNk1kh+1GHA(=!UG94BqYjuO{meQlxXz;(9xlxhyc*g(?ACrGGt*GfMGNk1kh+1 zGHA(=!UG8s5uhLw5r~aR>UgKA>TOLlY(&Z8njWXABm~VRiw92EbUh8i8sK4)MR|8nI^A2Mj%<3+<}FQPq_gg;7F85o(ItGwl@Koe|;u zpFeehL~5%d21+42?p>?GF>JC_n-eE3QzsqyZp4;~I0;R|1%khh$o_YEHH&39u(wu0 z&{fJtlQTIKWuGRAAn~NK8h{UCI&|)#kJHPpU?#Y(&x+o~wJhIAgj$cFJ2=OJcDb^{ zyez%7gmU`;sZTI37#eyPS_;0k>(A-(-hAG5+TH7;gkd6?3jjBJ9UzI~9BK@B2oyt0 zu?adHWNWB;W}&s8L2Uh8WlYoZ3iosxKfUPMuYYwc6Q zT+%86zE;RUv2q}0C_y$@S)A7r&KX!e^&USPDk&aOR{SoEw8oVsrFQnk6>7VvQ(YFQYbB zyWuQP3VqH;p1pSP{+1w-sInm0{7&Oa2n5(MgG>};13&~bl8S{9CJA6IM8~5eDDyLa zXAZgRQqgyh@Z;$Gcn2>_fc&U#USL~=Fj7M33HAw#UjC;B;e;CX&zZHJmM`mW_mC{b z`3mDNV24yB&AdcN8cnPSa`bgJ_UzqjsLiaZs^1_30ARh@Y63t9Fij-7OKoBXLxLpT z31FH+WcD!L#u9_X7lg`5V$3Swn8A3UHru_SJ0L^_C>DamR#|3I9sl&1fGjTsaI^|B zX?lQHPt*m#z4A5^!O{Mk@aJMcy4!p-K6)UM*dx zqHv(F;7ynYFGvM|@BqV$lY9;^{Qp?_$H(%pUmz=Gf;y@nKcJVeF=6<>rQsmNGDq8} z48XiI4LZM1ZL2MTmY_8Xw}yyPILf7vP!e{xJ^`Q6Hf+}Ao?_FN= z@0dGO6(AjZa-o&gy?P63Tf+8@9uNj*q$se6+IHAM7(?P}Tyt8j=ZWSbLxd}|M3vxp4%usX^ z3DN{YBuyxhK^;QgPkftWX@OG6IwgI!TD=5F7mV7s%zdKYsRV^+uBPxA7|7^Sq2D)aufhA7jpM#F(1 z*QNEYwB@%{B?G`)j)Yydi#g=!5@SS$iV(=02+-!iBUq+F3IdFh_>wTHh9dOYddkHY zJ|b#jjblre@e@=*PQIkud2s{lVmP9Ca<`HyiQhC^)DGcOC1|Nq$_vMW?k)-(uP=#B zEn%!q6lxA;JoM=oAq~x&#~|htS+ymkxEf25f)*BWA5m~-HK-Qan%%iOx)uwT0>aSj z$7!@R7|^s`s5r)hNL$v6#df+EwA(XFg4C8v6$g86Yx z!oYj3;!1+*9Tw4C6cHkUfQhQ8fL_v~ry;|4V~d3P5eioX!{Uj-Mqd(5gJl}YlZvIa z!Ii45B4L}7bwZi#o#C`cQ%i`87bV@!ixXn_=L0sbfh{=(fmmRz$XX3@jjmEkz*n%! lR0*z6SW$`s4r!`u!l+SOWyv#%mYCQ4UC9*TLO|)pwbWz*BKZIS literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/062-silence-blk-queue.bz2 b/obsolete-buildroot/sources/kernel-patches/062-silence-blk-queue.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..84a9a05c793f42b780bf02a77ae5edbe53daef77 GIT binary patch literal 382 zcmV-^0fGKPT4*^jL0KkKS%C!T>i_^fUw{fQT7UohW9G~RzpwwwFacDoY$a3Fr|M79 z1Ywg+6V!PTrC{*Ob7vi9)bo;AeA&kPfRsTpQz9gh|>tb z4G7cJ#*dJr)8jKa3m4k&37VCK4aH!~P~|{Uf9h1cP*p2<49`o6`g@9I8JhThh~!wa z9z=n!DBLTD2di+sZ9G&i$cWhgwNXutw}(DQNrW7Rd;}DK7sVF`P|_h7gyxZm6a$(= zj}h4s-Df zuO_((l~h4|(7hlrgHDAA;Fs`>7*bS(z19}m6;(79s)~{e60d3GNS#HZ+sWk-dlC_? cDU%``?HcQRQq#D*k}1N3ga{``SS_uuod5s; literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/063-silence.kbd.patch.bz2 b/obsolete-buildroot/sources/kernel-patches/063-silence.kbd.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..04c56d62bc7caca3d5668506dca1109c0b7d7341 GIT binary patch literal 506 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 literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/078-hostap.bz2 b/obsolete-buildroot/sources/kernel-patches/078-hostap.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f9ce7aaade82a092a529ce62bf018e2d6e3e9022 GIT binary patch literal 90852 zcmV)NK)1g_T4*^jL0KkKS%(sTr2!Hq-++ERfB*mg|NsC0zyJULVgbJI10Vo200000 zGynhtYybcN000000065~?60^A20k~}O&>r5>Aiy|qIW(M-L~HD`s13yQEStpS73Al zS4Iaw001ua-oE#e``>%ykR*Mf^7fx?)08$aMn1l?3!Xd8UB`R4A8&5<$GdFyD0=sN zdiC+}02HUb=4^6+_>SGrchNh}?{}xSY;~8=0d;^f2WFLRr71^F?5JG9s_wI&KKlY| zo@d?HZu{*$A9?Nr#JzXDzO?J^ zK9Z_?GL$x8&zCL%zRDU%?bi;43{nb7w$_!lbOHC=m%iV9u(#H_Tdh^~xC;Ahu~N4? zefM^Ea%|cwuJ>Zr?e=O1-(}jqy>{yz>Ak(+05Urm1!!mm0001~6i@&F016x600-Yq zcEvuQ0B8!{+UO1T4vvBA*}Z#e(V-)zhrIUHuc7oF_GlY-Y4CKJ?%}1|)_edv?D?zj zciqfx+1IBxOW?8ZzFyevTix%ktHbKC1Gn7uPMuwV%8u+hB)i$b0_)be9<)+{cX8ES zg_s_@hE#||fB+F~X7`%7QTN39kDXl8a@IZYx4i4)tR9i}G64GecRmgQ>*#%7eD!wm zs>w5Z$ERZS`VHQ?xlkAD1iUgvjR%iwpHF}>K*-rDz_3ZjbZ zN>fGMUvti>U3X*KQCmf-sJ9L4!)y-MAYI5kdJd^=x1~1>z!Bi?70hc{Z?Be&am>U2}Bb=PlW$6uNc+wA#u)A! zch1jyDE8g=cK41PhLk+kebuj65PJ1NN>aOEy7_Z^&YOF8O9sA&QoFXj#&@(Wfz7VW z@ab0Cy$T5Ny;ALVM(#avM(%A3 zgG^1eb$2@ZQ=mN_>D5)3#H#!IFR--O=2qFK2UB zwA;&0TTR<`*xK#@H)~z4cWV{Jr7km+j*@QX<=6*nXJOO3J6Jn0({-p5YiOLivP>In z)txrZ=~HCIJ1#eBof>pEXEg!4hKw6FH%5B(&;UI;yHf)Rz||Q9PQzD?#_)+?#70lP;PfrRmjTXh29l+y}|E$ z!S409ZrM9#T(}7)^^o8JF?f68*Opn zU4e1pn_CSufCvHrCV&7y2+){DNrVQ5rb=n*dYecRngk$$1PP#MOhKTUQ}&?Asgp$? zr5;iGr>N1O28<*UA`?LbVrp$BCPAsDCW+`&|5G$ddFdv}PgB~bnp0?-Nv4=d>XMQs zqe#_1RP@QIwHY3S@=ZM^5Hd0WrcDM$o}kbG2vS4@0Ga}1DX3hG|80Oo`#tfJxuax8lFrDdZ(2=C!%SlCLkFGho8gtNBoY6 z0%MpiGHp2k7;CvxOblR%V8|7Y38WDaghiucfLWH3Q)#bu-8GPAS(mQqtt6%<$fc57 zOq*FT`?GGMGSgVrjY=vQm^7;-sj-=i&9=Qww^rTP7~N^M>8S}zV^UhhsxgaZS9Y{l zYVEG-AWBq$kyW5U9kqZ!4unNV+$xW~7(i41nN&w55Ar|m9c`;^^?`=bGijqKq^R0$ z8Z9A9V#O(`h|rs0p^7YIq8da^HWCt|ip;@SG#V(Ffkw>;36N5Zp%MtBMr3T&nGqS7 zsVFriqfD`&z%<27+aMN_OsR_!BE@D?GM1$cMvG?6D4Dcb3kFDrL`h`Pk}5P)oL-MN(lYEsGTGjcwO86^SgD_xr3GG8%(Pv?cVzgNOgW z|JP^#%^&nOjaRMNKlkVcG};qj*vXJAWgA5x2^&VJsg^?}B+}9)Bw(~jV-cw~%C>6K z7R{Bb88noVZAmsn+HIyKnqneqOfQ-iis;CGXzkg z(8y&PYZ7fGi%Et>Ng55BRw9Vev9JlEsf#3|CQN~;C?wk$!enNPB$kz)SF02 zwlx%JAt@4w#)z;LixrblWMwAOY?Q+wSkog!Sj@#GP%_FUlPN|`P|ae-G)$!}FiEtQ zmNF?!X;Ug9gG{v+O=(R=qf|<3GSwQ5NmglXi$$chlBC)+RBYCksw+iIv0;&{#4%=B zBUrSO6G$~BMloolwu>=jr6$JIV%aJ}DV2?rMHHE~N>pZ*EY?h9v{sr}!4(yiC`h3z zDzt$K2($xA%*jT{V^N^Y*(O;^V34q~%>hznH8T+tF)Sw0rdur3m`t{9XxSpvn9)d^ zMX?r&D@j^4vT7<#qcdA3*r=?Or7Y4)H3-{SlEsa*S~f!zsLCj)fVGWLO(@z)mQgWd zG{IRS(N>#Om2BA7nuMeg0c4V3rW*`MQ5XRRWQn9CLMSyfjfJ2^A*qbYBQz9jgp>)A zB#g+BDVj4$EMhSdN+JZ7CaEcs)tbqoX4D&6WTuqI=8@X9%V^)4cWFo_Or)6uBqbR$ zMHWeAkrakljT`-rxSB?gh$1rDi5Rf3%xH$h$^2cqWU~~E%#krDF(A?sZ6q>4nUfPU zR!YTN{J)%(H6$Un+GArs>VN6uwf}*Uo?rI4pqOfmqcqd8t+CBJXx4<*XEX+8m@1lx zhK!QMl4cV^$O?$sRV!xD)C^fQWUy$lq*1cTV=c2QQKd|ksaYdTkjoZIOqxluWT>RT zn4?imCV^{f2@ulBWTP2Uno82kZDNg+DUGbsjTwP#)J3G4O_nU0rAi>uS*mEJrfNjn zB-IqMY%!KGrL?xjVpOd#jA@k2nJpls%_1fS(kRl+OIPmp-K8ocM#hNJOsgq2P}Q_- z8n#Uug=U1-OwlnmX=Ft;D#B5jvN9;MESRLSrixOOC}Ux2Vkt0S+DO?g7R94zB{V?D z#$h5TpixUH3mXzrZ8i}Y%4X5CCMy~w5{)7vk!I9}8$q#?7)d3HL5#{HW=$I`k(pC5 zu~`twStcbmfq{jMOf;J!M42N|l8hQARFgw$O(u#6)L4{I#w5a+M8=f05|T#7Oi(P@ zGFg-enAmA0C9zUyl^ZpPqf$nMv>HvYn=-U&5R}U+bEzeYWjwk%pUgxU*YwHBs~ifY+^w%2Jk7@A2-CZyA8vr2^ttT2fdmPIOBl}Ot* zMI`_zn?{L=5@e-_lNJV=rGzw6$zh~T6v-wkQh`*I8A@AK5ebw`q?(Fal1(O*nG+Tf zX{DqzQKm_@B^H#B$%af&6oDl|Nn%1mHb#~)Olr*2EK4*^p=8zxNku7|qb#(hie#d# zGNnwKlUXVvHlm=bMzoePR7IIoLQ#ap7HKG&iyH-~qAiW7q+=$bno%UhO{u9(6rmc4 zH6}@9#%9T}S!UK&0?mwJvu4s2l4Z8hlW8$YNs^-_8pTPK60J1VQdL5X)w5e^wVEhw zRV6D3kZM#^vZl6~O;wsR6&9dsLo!Urlubbtn3ywcsVSyPCfKp88rvp~Ehx#2VVcIq z#;k0{GFX<S)!~#*YAxUXc7MZL@v_-M8w9Q(hV$n&fSgK1KQbi`(X;E#P zDIzgOO(_-`GAR>g%92b{B*|?vY)eMbYhp;+F^JK$Myf4YEh0plRx)HYqeTYTtr}F( zpv;PsZHrnpl4Y8bji8fiRg)Plr7&ojER8B_O8_j2FoF;&G@=C{MO2!L2~{&GY=JWx zl7x^XQYn%p*Z$jozyEz-?CXDd{yezD&+@%#IUl#qy)XaR1YyG!X(Q)gm+&+6ha z{+U~mgOEIefA93{_Ur#eOKN+Di z{Si4S$WwSmKRH%Kn~=a|MqO^5xE!=R;StS|@j2y`Vby?SoeyUXBez`M4?DP?@=jg2 zul+pwb?@E04BC64?dgIUEdleL-z@HrrF8vLHYCaTv>fo{XFt>zi6w!Lv=*Y-)V^?NOb!`gWB~2=_MC1|)bi zh#i=@D6Z-Z4K!a3)`J*IIL%1G%(A%{<_|AA#`!R)Lqlz8iqayxH4M?NmL@80+T%0d4k8`MxvzO+@%kR-yE$}$53h^25~;Thpfc64&Fh#em3 zo7V(PCv0KL7?)unN(sBH8G1-Puk6`&r`M%k1O_=GgdqjZLgNS#%!6!VjE%B2WDH^r z(lO+PnyvXuUYQ0CZrp7-Asj~9te`dy2yoLbfwKZ@qBhD*h+{_NV8>Y#7$$+btRr?t zD@jd6q>$Ys_tC4FtW|Z}9W*2+^pgKZ6PcWYvR+0Sfp$y`ySl$iE|-{P3=lehxkdIDXkn zjE+c%OPV7@Qs*A}_Vwq<<@WW-Iz-xTNH=K;nF%;&i0Ov+KIPeW<|l4bMaIC^ZAOoT zzmCpBb8(<0jxx59x-PJon^y3O$gi<9^|X`rZNfeSHhkeC?T zNwzZ5J-bH9BNo`Dgqn<;J#TwixkJDnYarQ93pmqvTtk!t#u>)~ch{%=E2(^L zv}hYH;+#hMXo%Bo8)l>+>)xQ7j5-DrZX8(TbE9q}qQ|xazL@e%T{9A>rJ>^{@w_`s z!7@^98rA`Ez%^oQ20Uq2R#ueAi4I^i;6tUfw@d37E*q=F?Gvj7#iuWG?*}wOcByYdYP7N z+cu@qBvg%Z&Am3VHx{Jg1`W2x*;;m+$l0dhF_DFPyL|_}=#P`t-#ftgdiCE*;xz=- zaUg64*giKX#<<|QZALOgn~LgV3}|B;ZETV?5xmUZ(Nh~^B~~+Q6)>CDypKH_;Y4u3 zzGH|f{GEBDU!hhK*6CWfRw|8X+Zx!l&RmVkH|%2NZydRwr7;B!bj)1L5AjZWZL%~` zEJZajcR^u*@MjUAicO1S^7HBYhLALj$n}*s4FkzPh0++2P+{ZDQyu;N9onwo@dsG~ zAX;QU%eLPS{z4E#+dJ!*^NuyX3@!U&v;W%NFDk*=f+l(}ThqvgGcvbe!uciaZ7T^q z-gm4qlO91lX!GoAGWcE^<9-v8(ZXtLEEvGpnL^9Qq}sw3O9?I6H#z5VygH3%#e#cW z_L#aB3-{dy$_#vY`>rnEt6%g_%%{E-J|~W5L6kP% zSs$xd!vc&p#k((9jA(z!7xH$_aBO@Mv@z5--TQv+^RJ5XoH=wHQ8^hD;zh-VvsOmn*%(_&NfS}(kaetSvW${rQRE4x ziq1wV_933k#)@Z$cC}FfL3rmVwV6g@MClcNjYP-oY7E9e?80(eMh&s&U4Ea-u5!LU zXktSmUw6fNYnzdr|dW zn)+8Lz0Pbcjfl1?+j0RqS&JK%R)VIZBaKG)lmdl|l94vp4Xrp040;vYC7+JrBPkzE z#lL4?Wgl^yWu{n~9k5N-HWm@B#TspliNq*12H#CpEEn;H+GRHPiV$dR63NEB8FDfY zmT<~-a8H@GsN;xl(Zi0fyxrZmrOnfFj$hSP&E-erjL~2ksC(xkyQ3}h19>SL!c1d- zk<0qam3+-ftCu4f+m}?*b5Wz`u+--nuKy258-sgsrrls-J~}lSZtjCrXrPPgUp(r$ zi}fwYi|doGxz^)*yY#i(7dnBqaPtjr7%_utLIWN!U^JO)ThD*T-%G{>=U+Q>E?wQ% z*Kc0#a8sQUd~370yDqQg`R|`Unb&0|ShEvt8j4Y-Go*uKJtr!hP=ThKAemwufJTVZ zO)-rHV#bOv;WDbBbr!6H3@^~_?$^n0cWpkr_UMFl-9hOo2*$#s;ba_P0kK`cqY%ZI z84^S>n1(>c);FUgIBKc5IiMgIC45pYeA}(Xi8bsJ6RT())Joh?C2cT%E}z?%dRg8ooEV zy4vN_ZyHlLva-qdaC)>nbj-b3jWrT;CRjT9`S$u1WJFnC8pgOC&gsjhj_%4Dxxgt(9Fr_F6JuDWtcN?S zj+O%~O!&XK?hE=2d~JT?aww(G_Vl!A(745bl_RjID-yEVsY%B)6Ot;2M255*T z;z*5u>f=Lg5R@+P86$-dZw>!kQ$@CAFcQYt8B$W=&^*4gKF5rP?2ciNyD%vNsT0b5 zl9_5AV){iCQ850N+U7MM8s&>A6&0i+u^U{iaMmb^cWauHXtB08n&T}cqix}GtXQ;H zcUyATBF4!^HY=sg6kD1umZGHG+jn(bwmL;c6~hPg8;6C`ia?}}#v1niJ$M@8{;b2K z6jd}(%13qhZRdAm%DQupJ4gf@5g891aTJ4Jm%Y5j8s*b&?%5Dmb=}>N?zP2D%X95_ zQd8VlD3Ur@v%5)*Y-pX)xp#51yOq1R%ev(#moMhLit}w6@7nIm(yncCGGZ#bt}V60 zV#IfLeD0XCSFYvD~tEzNSGi#gTKl!6f$G7?O= ztFybbg>sEu-S+olvTt{5n(UD@o4d1NqM2h^j7pu>>}idnfi7GUD0gn3UhO@_8(ikV zER%FC#t>Z9-POYZ7Wcb)C5=XzqM0QlyK)hd?z)`2B8?JE*E=;HZdJ>WMYooBR)ya0 z5G0<-H!&7un97q0axz0R9E%Js-?xqp-|@21Ny&;6Unw&Zx`7$T^;3Da1!zNKVr@2= zB$;aw{S#F`!nI%c=E|2AR3Zl*JAbNeCb^G9WPn2=B49>!HEJ7J4FpURyHyp;Rt`j0 zO1;-to@7$!l{w}#8_BcupSIs^?H!gBQL>qLb(+aDx&QHSk&;mu z#4%VF7LQ{CEqjP+kuu=_{n-AhaT)w0QiVgZRN{^MJEQBGuuPsxw_8n$nnPC6*)^4h zOl!i{vm-91F!)8LRRNP$C-~&e=@7XQYb8mMw-Zej!l(DGI3KPpV1ETW&C|+TXS9Pc zvHg5|{!@2nNZ2@tuv` zy6Y_nK#acp^}^pcF2Ak5_J1T^b8-1%omu{UJh#?w)_-=2-s(7sHV(USfLi=^tiSq2 zKw>E~R)5aN|42hC=J+w)zp94Bt~{(k|5}t21yvz?0O=tSN&ux0ltQYZM{)YEho|KM z-|*M*Q5Q`K2*11j!!F@RUUWz2{v7`Yu5tY0IBi8A1u;D??`xX{^e>d0aqH9b;;F6H?|(B#^nTdeV1O2S83u}dF|4+ z=CI7`s<=;-Isyb&ijJN96p|{h*0}C%&eEoO&RJ3T)%J?MYypJ}X7~LBE?{CCaE+0j z3|1@vt>vNt*bK3|?;lpJAw&4G#%wgU8XCkf%!MVFxp%cgh9kUYheISciuClpne@N$ zQnoApq$M4nitqXP&~mfc#ew6dh(}Cw*S2%4nn00?uL~H~&l_U%2hD>QHG3%BfhMC{ zV>I?h)i6 za|R)qW0qE+f*`{c%LQRlT7hsX(9ZZ%PaM}dg4LR^;jLDpjB*5NvAi8CY5>uMP#88I znu}adqj9z~AG?xg5_;rqy0O#1<4c*XK++uikp~Y&B3Q+(YU}O0GPMkbFu!a946GX? z+aF|XIWX{pn62E;ji~K--sGpT!dmHW9&Eg`BBY4oTqdY^^sv^U=hGcAT&y6ZI%Y9aNg9NzFr8Y`@2n$~IG;@3 z)Wl6TMnjp5)YaY2eVV#RNZnU{R-T7ABEx5qCy4El5-=Uv=g$5okTRYz(51HctS z%lG47zuSt2;lw*FpQEU`AL*A}qKkRos_V}vo!2Tg@uKFu=BU>-%~zK-UQrdfZfjlc zt$Vxkb6*<;@oZZDi_KR&qiXW6jzxZ_!hd^8F;9szKPA}Pt-r1x!RVNk9b^1bmIce~ z|5*@Jgm3;|&(TxI{U2VvdpQ)b-38cmsYzYZg6{C@9I{lDK2=MMbE|LdTJ718%gRkooJM`DJS@Uy~zOzN2fRR9>f4> z{N1Sdbg0%^rQd^`gFr$(`7Y&gSW6O>h zI`OPUAGmNEtaeakwr58|p@HW#!Q4V zNB6hQ%Rvmp2L0Z4bHZWv;r41Z_vU4WxQ8O=G}wt8U)uoxS+D$W{Kk{Kl8gTIk{enW z)VWc&SG!!^o13Us=T~<*(4wOrUZySXc8#p1Y#k`qF6rKHWMtbV8yBwXxCtdm1f4DW zNY{m|OJ&zFs^F1qpNka%9JGG?RAL6Okw;Ey z`M+HvAp3qg`zWxGQ^4q5nlh>+HZv~h;~i(6kpArZ0 zyVJ{GPF-T0$^f+O4#+jAObAf$o6gVa-$se|2p}52`-|we{k}ANk8?fkW)3F|-IH$h zOkCHoF(@Q`0kH}PwPFl~SUPzx`g8Vb z_RZpD-%hssuCe+lGRf+0GmHPL;dWOIS-PTX&jCUAyB=)izav3iL2@%0$3=iS=In16 z9h+|c|73$NWwCN$#e89(JaGL3P$;ZWFrZ>mh~4X{?L8|(G&LU()^3^poSXZfqo5tx zL-?gfHPk?tqz90bVcEN=X5JFRHFR6IUaIWcFtR7M7VdlbVz|dhqd(I;Ci_Hm1m?p} zOVbTHH9t^0?rTfP=5Rmm6dl;fSx~7-na6hCvF(iAh+XwNE z55xB9)8+JN9vW^^?^W7||MLB-Bg{WoA0ijA;{b2=E2oFRS+WcK*4z z@7G^$Db26!>GAj+en^0zL-}9kl(P^3o)GWpg|p+wx*7(uMNonXkxUpAAhd>*{p11v zW*AO_qz~|hW88Wop^YY;k7w*t2-xFE70eJx9J@MT<*q7|7t@E`K3;jC61 zDms`e?CwRXAb9%FG!1KbaBN9+&4kC*%qcW1|rK3ax-JX5212fS%M zJkM_r_#yfv)j~mgWdB~l`~CSxXLr@|*cwv-`+Q~sS5c5>p!@>wPx8JR0l-IucnSxU z8jt1Q zgQ6xvV1kGeQ$>iPVe7j3Yl>=0hLngt@ZqgY(c=}(@55;+X=pw=q=-x=E&5#N@K^1B z48I@V>Q8@vYzJa$C;sE1X3pxVfZN2Gvq(#Lc4UN^#3?`Ht23+;L8Ktf@Uw4`99xoxBi~hC%$2g{8jb5cWL*J^MM~hSXk{$eYXDg z`}?H`N$rDM@5k#1>*(y)_59p83;&G1gnl=OZM0*pyLpDguAEQaYd^tv1I5Yw|8@0g zsH{~ReOtSqag0l%*KcOZiTX@(rvAD(^yV(j)C7w0W@Y~++YYulPEamAk7UD@UMtu% z!yo=$0G*y9T)_vx0K zq8j~`vC*3CzrvS8l`ARv?H*jS4wy67jl10rqu7ttjVr2{(__~oI)~Y77&w>??;zl+_z zMJoHXCtrloi6^z==0~aqkwa-Ys zt!k0ntDZG$$sx&LKK{qU7)GDVC@vJot{P@f%u@}Q$+K_l*-7td9#nADugUs&IkkKE zP(V01yq^_lVB?)@?Q-=I6@&f#?S8vld{kD>-?0sZ#G#!SyF^Bu2q8EQ9aM$|4kgmk z?Pl;^Bl~gkaBm*AC(w&bRifab{g0M_}~10(CAwmpaDB-eY=GKMj&`VK4X{u-eyoss2K=e%~GA*&<*<3$Lew z1H;y!CA@tZ2232Y6nWST{fakMTQd!q=vc*}B&!-{(e~SOl`#x_K1OLQ<`Z-*{BqSz4{-M9PF*x>*%3PUeI2t8phTe9&bS*Rg z0eH!tpr`9e)os8b2}K(Av`F8mWW?Dlgat;rrLiB$`3ZA{ltd7{b|ckH()dJ49@yAi0FX!)Z=fdgrvwkR%+4)Fo*ztw;n!9*L~ODO8D#(bdUw>Q znFFzdZNU(J&Fz}Gi;m1RzM+FcwTeL;5N4#JMYypOf&>5-jSim=dsrwnxPGJXPL>H% zWZ7NCeHy}DVtpSs2jV~cbC8Y0`h3`*fk1Qo1%aUc=sVFNjmP<(-@+V(UdKWW-0X+n zv)2adAA$ajL9f3grk9b!qy8Ulmtv^QyX}*%P!MJmX%?Hpj*xs@q$gIZM|Ab&ZAqP> zS77D3)V9;pzwnioASf$>Dt({!5eNQ&0Y0sd_xpoTeJnhAcUm11l~Sb?P?i1j7v-`4 z-}iQVHsBs7i3UYb_lNs?Hlh-hq@Z9aX#k)mPRYg-{ISSbT2O*Y5Qu~)znCHoJzPFW zoLAU6zJa`ycc$5=yZ+3@-UJ3Jgn0}~s1RR|`4|4X6$!{d^!}Xhi-L7N*)E@TzBIh~HYg*S68q&IH?tlAR{qDQV%e(UrXU?P>p0{!@`p}7E z8*EVa4j(tWo9*$@z}uG|IyRGO8d7Q~DG-8CLI6pG$ZG8`(`zlLD=+K#@dGNzDb9?fHB1 z-2e8}_y4H!|B@&QYvJSLXd{1}509g+&()b7JAYs3&D(IAh92mv!5_iQQbbk=InkG|FJb75j58rV<|r$QNkZT$G8_ObYRY!!a=YR0|Se zqDcxAZ{hzItML@`d?R#slxhTRs!5X6MJyy}h>Ji$BxGh&H5CX1fB*y`D2Rj3?H)tk zq7TpIWFqzX{jGD=J_I>FZ`N;tA-vH2wjr8+&rMKbi*)1OUKsVJE{Lfid}+l8-v{fC zeBHn2^j^m4#@f$}9TN+n%%!6a7--lk= zr}!`DJmyp|7JBLP_xOA_J@EH2k)-Lm)-vV1e*mtJm~fD=Irdp(u*1FG-QC^Y-QEs& zHjnGU5V}m<|F!iyr2X*wfAEMdT|>WTcsPxv>`e7t@!!9G{Oz{fLPQbjy`wkCBzq;u z0wC>=j4SJ61u%VCm@Y(wfWd(n2Y@bhA5hG{rl_u zx}VVXCoB{78}1(S0Y7cgd4SC1#5ZD*$%&w54Y+^I#gPquxxi5UyhE4?CIou$`UG(b zNW`m3sjb{r3Y`6r$4TCM5UuVJ(jUgyZHSco9_4GAo$C%N5Y5%Yv*%$2L;*B za@}NN37y5;C5@B{HY|@>V*-*$_^*&e8shX2cTx|;cI(`CPc0!ry~magwSfdgL0K6? z_v>=g#&t(2AM8Uiik=;ISW55vhC&Z z$~@XJHN;3OHr`F;3Vt3Y>TGau-PfOSkH9|a#@zx=-++BE;K(DX^v{6Aos z^dI%*q9eHcvx$EG-}o9oCy#&l%s;b33tt zY;SUlE(>iZ31beJAeOkW1QKeXNdkZXz(NEHs+_=f_4w>(lPmszzdkn9dy6s2fO9Tb zrvlL6oBJatI4+t|z&*oMRxW$yEF+w9y31HOt*D_Uk`}s;Rd(u8w+9NvlyjQasexdv zn3m^k({;vD+dMV}^hBaWI_VCCc3&kcs(!sqZ&4Av=kD!mipjpT*n+LCB3udPcAgm1UZVAC=8nUZjfDxkDr zexcUaK+c0FR5kl31hu zl;jSBF^lvn4K8Ypp9Cy z-W=LX=ZkjYG)z?Bnz0ItKoz*Z|;$t2q-7-qC3072cEcy5?am7-$c zubs@OG>Ep1WaX$&Qa4Bzi<*tgAwVyWDRQ9>Jf_Rv_vrCp3)O^Fy;6%0kW8X2P|=)Prjk(}g2ZO-r5a)*3D;9)%Kz5LYkR9kB} z;3upl(Aw+AxZk&0!ozeN>_O+%=c_w2J_Fee8>s>~vneR3ON2%Ml0hV(Aty=fvS7kv z2^Y!^gXi%3@|#$u>MGWPeB`TcZNr3l9e#iIZuADi2oI0ELId42-kl?`ZZ2lfKYs~z zfXI}pTL}?6^-9vsLDd;GSthntzjR-Glqibi%L{bSwmVynfFW{}?sU(A zpMB?PF|y7gX;oy)F8!kk(9}!0I>ko8BbJsO*T12j!cMWJ5^cEf=I}1L_dL<=#Gd-q z@VtvWq37LslT&V2F;mcgGdx;uVf3dsP+s7O_Tgj7IK0x49+?3AVcb@B1hkC|Xz zID|oeKtP5iwvF6$)j1Ru@whslOD;@OY!7g1T=u8I*oYlGSd2jB86V@p6^5@5#YnSu zK{OX4r`sXGRYaJe_4MiVEivWlY2;|^;gf#dKf^~N@aBm62QqRyhx(iv72)p;Anv=L z^B`fKdlekQ+NBG&EC*?>&s zAYs6CA`Z3%5z5AkxxW%W)cr3%PETtxfO}Y=lLmhQ^aHE&0WKDC)As02;PKYQ2T*GJ z0Z5oJlIbCi=MeYx$HpeGpyqQ?am(;!{kuXi%%#*gGy^eP41Z3PT3|Y7ZgCoYUQQ#= z_WzHB8yUafB(!YCJ%71N&DD}ZNT2+ql2NnZJoS`e}?0+tQteW zXMR(@j!h^H$N@|K@irPPl~Eu8fA0#U0th5>YUkNL65~bJMSkJCepqe4BtVrf8$!O^ z{l8t__Alh#pI1NG^0WNH949Z==kcA!qUS3t^8U7^q@UP}Nd9wCckxutz{UXp#^BHu zo|avPhx^+UzSy>QGvw@r*5=mJ1$&$Cze^(D{?-cu#o-y?NdwUT;Sgk(BF!3<1I$~T ze~_%nb;DQ*2E({{=)cJFYiungmvrvwC}wVS*#-hcm#r8HDe4vofq_xJ_oZgtcCx1i zI7oW}EVnO|Kg;>JekS}E;{p9+JyMe4=6LvRntVNK3iuP#(WU=fMvb=y*}gxk*ZmA< z$IHuJKGl(Z56W7kU-+rkxl65iJWX@#=l-&M@ApV#nv`C!oMbczATWV~a|6`XX^=hN z@m&`O4wGY5Kb@`(9Z*rUhM0@yqcd)Yz;=iYjjstN7p(~56f6c8YDV`61p*KO3jd+# zdygvfK zZc(=NGbEjR_=N`0|ICfS#-pE4w)>6z)HaaE|LNuq7E=D$*SESyG?Hvm~7NMHgF=_0C@yUQxOQf6%8B+H}3dCjAJwClcWzH zA_}!wh|r@De3(~SL~*4dJ9f4*$eooTBRnwbCCpZmK{)YgBaN3+6PG0aN6#uMm`Fm> zZ$4c72dD}8-2KAEpHvnl3Bkl+9O!(N8>Eg~l3)!;2DHR;S9+F*AVjnIxY}k3ChD>c@V&hJI!sS7eJp zX&HZ108WXGUcq{V{0G!5pNDd3zVH(GkM!&wmZTr_CHQ?_UoTzM6TU@i0*i@*O- zDZjvHWzM42=3Th`uBqY)UyXVJ`qjj}lURAUXBT7d#M2{06EJ*%~QtzE6kzV}Ha zl1U_zNhFdAZ(iBi!U3^_tt}%q%q_f@z5DiJJrb7 zD!|Fb$VbPL^tlT2}DP{~{(9abP3I5=rW=$g5KZu6Yx>b5U+EMADY1PJt^iQcY5 z^e_Mr2=~pE(8xaP!v6LEs5?4^!doAp4Uzl zprPQ*Hlm>q8d#V2y^eTLN+KwNwHZF^`1imzkw0fIaes&V z%fFM;?0!3ST|o^34o-a0Sg?KXgVUc}00|1s;!rANVFWXG50uATXkOUNIbEo|qnzID zV=@qzq3_e<5Y=k}5(a9(#CQY+e?t?| zsx^N3vxt$Eo3wMeqwQoPuxyW`Q9%ioNd2zgC_^5LnK%t`ve&Gs&nCF|)5flT=V3J1 z{Y@NdG8iMqo}El4*G$&4aQzO`0~5fm1xYBv5oMwBGDRC} zG0#v;JRuf!5T%f^#)Y{?e<_9zSbpu^-yV?=Ni*HYyZ=h(=5~JQ>$k(Zp3V0Wy-h*+ zl+zeg#Wj?ePw1e~?H+J336 z$gzh*H6bCYcw|s$VaLQB1T_!tZCWStov7Eyqz%V;p2{CIz{cu zcC2P2EB+VEnDb(z2vU47oSYpJC+B?S3!*I{@@zY5rXlQq${Jp+tN49+?EJj>+290v zxR3YHQ#IyKFoO@t&ei6+p5|Spp_Z?4_C9RTyE6?V%A=23)N+uBh?BeA%d~Q5H(Z}7 zmNKxn1m&lsQ&%w z5C?!L55vqTAfRC^Kz#@lM2GWr#CQ^ULP&TP(u}4Sp$pW)Vg-a!w$m@s!J{Mj+2l>P zu9^KhKj}%PAjeY39-;ty3^9ZSPAr^qt!b4hgz-`Gj>OUPWEe{UKj0|i9+NIEP(G;|V!K~^}ym0)ex6gbqS?IxlJEO z*Q>;N<0`Ydz+4q=U{)8anNK43vFOwu$v9l?^3W{8mMFwfVK3#A)lgy?sl)40h>!x&y+a2q2lca$*ZNUIXGCq#)i$ zy4n(`q2%?0Q2OuRq|epQ{YR$lpFUZuVvlRMfgw>rFb<5Bj$E4h^O&h1wwJ zFPhd%87hU#=+}vM!w?O)^Xe7t>T1I`Hvm}CG0lcU4GN`n@T-PF?PmhX@);nqbaQhf zs6SNVY>lq={GAkzSmfF=e$jfiQpVL^O@FrPd3(NxZrI*@|6gOx8D|=maUk4(d<8}+ z1T_^9E;gXj)n0bN*b0oA6T1&hii4kfXo4ePT8f5^zR;(ZPMPC-P>^sX2Q}e$Y;t+7 z=?nRmofsEv>pzde#cXB_6gOzZlRoUTYT_C}fVS zTj>~Qj-c8IysE1V%J=l5=7)3*AHZ|M_H%cPUflbu)`~IXPP=2O41LyVX?Iv3s=i}y z^c{GH092I@tOWg@w`#dwgX-1TH7mpCq_DuRw%50O6hGY+`8jZCIZ3?5go{XdZ)MIh z)NCA04bA+SXB}(nc)j&DQGre4y2bK7geO5y(1=~#=TBjU{8itwp0BhcQYHEM8XXb( zPY%x<+6YCFO%;lyrFI(8_2Sj!ujC4h#s>E|7=@th35GK?K*zTS2_{Th;DoBB3 z--VFm+=SZZwSIU+=9X=KQ*UrLFSwqwILPv}p~l z3WG`|;38+X5T>!1`^R0wp=?P5E^yJU9^g7idWD5qqM$j1WEB^HD;}v@=CySfj8$?+ zif5n@9>jrCDPtjE9mA_+RU$7r_Q|vwypmz0j&c^r5za=$#>LleEsXG`XFh}o5(NsB9FhCCo zNxkdB&x#;ORN(IIy-3$SMjDc!{vV_CNg@vi)!UuxJ(h{MsM(uHT08U9qZs!2HW~u+ zs*aPis96i`Q+1YabGJ7hW6wP1@%R<>d>^WMPq!>BswlQ!on?j%EssQuqTYOL_(~Jz zve;`B*>J3oV89_D#<~jqjN%}OEURyp+NYWpGJ~RF-MkM;L>dT0GPa?C0t{(%1;jNv zP$mcf0}qdcJoKod=BSr$ZG;Z|I&TiBGctWO59Tp zNX@@F1=;$XP4-|rkpUAirmwGS()V=1@;^X(?~C@2aQJqm)6-TL>Fdcat)gjsKq^D( zO z;j$i=-yh~cz-`dU%b`b01ctTHwWEH|DTW0H_h?_avbNU+)3JA%1G{!G=#+nk)cacQ zdwn17)Uig+O9;9RaJuwxfV+I}nG@LxIbtP3bDz49jF`azlbOGr*jF1mMP%!Bbv3TB z+2GqMbCjH}Xof9-YPt1|uKn(+z%!rZi|W}j+S=t~sA&q8s8xdG>n=vNQ)S{xv|1bK zfQAdTydhQ65Jt}>$iOHDJk2@emIic!l_(q1#kwJUO*d-L6niDl3vkf|sQA2mtb3$j zNVbgtGlkw>8*6dnF&~v`gd4B(x>Yxh1k)x;o>$Z7{#r9TdBE0-wV?p;LVyqGNkkmr`g~M}61fP9=;3cqY(B46zsHj2 zy!>VQx%qV^`;W)*Vtz7~oqFlAw>`{n!cuRb!U+KDs+t5y_pbDXyj}yGf;T7kTV#V0 z?28yF(Lxh=Ox`e{WXp`Csqn6LTX!f=vHTEU|9=P4?%L~g z>vfEcZU@2{vr`h%F^hy#*`B^SVmSsg#WaN%Bq<(rl1ST6$_9|im%(BbZ{Egak^q}F zjCGNwU6LuNP3kZ|AAffS&Ib;Rr?w;uDm<(P0s_uxcTEFr=&fLVthQ~@5ORznT^_S7 zG``p`4Io+=Qb@nn*k0h;=kUI)?;2UyH6jXxO|iKMzZP0C z)}d z^=+#HphO8WnKZl`50z}<5=kT$CT#u@gMVZ$@bhG<`yN?zRF`c0t@Zt59`%day(f*< zAdmO{+txO~4UhV}ruTd?hT&OmJRH0Ce`Q};Jxz|Az;~UVO-GoO%tfshJDImWrIrJ9 zpBQZX_C^m|*sM{{jgA6%UfUz)8H-uE=3qCV>b)%%=0r8uMc0SobQNwYqmu&=5o4ue zcddo!=SkFKbVfaPry`YgC;3zSJYAi~or``^^v^IPK)eudN!>XIffbA9a%;rGdF(&1 z1nJ|yU$pXjY?bJ;1{N#&Ov=%Q6HFogSe_U+j4{As)(xRH1Z5zkw%C2m0c(j5RZyuK zVi4Lw8*OO{9khQOo6dv|{Mc!b3|Y);lIEnpfUHgOqz6_&Y-zIH2h`G~pv8-8TDYfrVK3GsTVt#)(ylQf+Cb_q; z2i*|TPi1PK1HfIP3()s zJJ+fvVxEt%Xp@q&>XcSLjvg@3-W4kx{kfT z7L&ZSgE7ucN4g`g1Sh08kU=C6NimvATxxaF$^Bbv&poH2Ew#!1X~<-fLfj+$Aba1- z^wY`?gB_)P5=2>s5*Y`VWDh<1^W?kzJoF-i2WqAMdN2eO}iZs!h~ByzHl@qVEB_J0m- zZ2e1`T<%KMi;?6ZcPG`Gz(v;^FMFkK7YNrD=r`^AYe}1nYUr%O! z%BrfWs;Zy>1Nq!PiTs0y0OvR=s;aE7AbSqmoqo?=|8Cp+>(LV*-Q>UB)UJd?1pq-T z%h~?^+`1oq_OjrcKqv)+u@osPLPs$Q)9k^^@35{sapND=@8PH*;|3QS-$X?lbc=p) zZvKD9W|CduOh7XeB5QV?tSH3dZT!^Jt03BBaHlQ|xyssYqw_OA5;ND2EiT7wXJvsz z8@V{H9kVK^E3_4@IhF=lk=;F8u%GDJ?(EO=+~@^p<~Q}LL`q1Y3Q!;m4#i?7@&az& zp#(+N80w^J4Rf)Z=mQZ2N&!@#b?**x`|WhggTwjpp)Xe!3mM<=c%|^fzL&o)@o;in zyO;$A7gr9O8&j)Sjm@aMGaZn{^xo2L4#g0B?(OiWgVpr7IzPHVwl`Wz7B(a!W4%iM zUL!~_vWt@2Z{`{LJT=rX!FIjcut|fZ&^t5Gn{;a&iKF(S%nCmuMZJeb0yd4I+^ou2e!l)9V6e@AV20P-i;Fv@w_N}_fONIUN zw!}1IBO1ELTx|>h1FxbZOkW+1zd4Q27x&6_vvN>c>U1i;aCx=PIJK{AhLCalU_Vql zOY3mYZ9tBwvrQ=~68ko?S4VA=MY~~@pPg2yxa$TJPunHaW4Vr3EOW?)$H4=MaIMGXsA$sH(Tv`0*N*Snau5?eirTj`b2U!s zxUrJ7DvHzXu%VfYOu^;UreJ8d2J*%sY+e5!&ZG1#zk4k)oFuM{^$YD$Yix7z^8F+` ze`@vD4_DqTwA~Ny{5W|=$mwDEcyzU})W%lOv)nG(#2G$~=v7KO<@zv?_;s^~&Iqg* zFb?_xfDniRgUk*#FbHfMMhAv+9{6TZbEvMS+R7yY17Y|41O}53r`SVr3c}H;ksYYg zh@L@KSkOoFoqRiquvpJ~Lm?xc;!o0`AGlO>3dMBcCWlOrXCks2hi^{dO zb&pP$&E@K(bB3_kTGo_j`19wP3E(aYl2t<5ap!2aZml7|+oJpvv3h*u#|_Fjt)DmE zc4({K&EfMl73^^8q_u~*TCLU^go3OEj8r7~vgL^i7~>=x8%aVzv<;P(LX9g3ZV;a6 zEXa5^&<(ft*zAw!AKAO$tKFZ!ev9;dSI?n%0002|y5RR++!r0fUECJ{LPpzdw%cvI zmqeA@8~9{zwYQfwBXpMT(HC(Roqbl%3s$iW*?2L697x$eS*|98rQqlF-4}HJ4{MUI zzMe^d%6~-cN_0A(?`3{4*J%kLlgArv^5bo>Wbf1C!Nxc8t3*h1fwwLmN@^0ps9`&u zqNTN7_PmzoPzy|;%nc!P-;I#6EYmUy02y*34M7PM*WJmRo z>=5bMwVWHa!|ih!Qo6P(5)9v$IZMJ_=?6L@4U0IHEhLB+ZubL#~ZaCyVjP4 zX>iGw0irJcqqe~5IhMD^z$Sy5EW!}-@O<9z*3ZlJd_Ji4M=`$YTj2p%(uB4rqI0gg zH~x9|9fH;rMEX57qA@Tsz!y;Zf-bAll1u8*?7dkF!z|;=g79UAmezQ9&#l#*BGT*x zfkBxiN;Ns*6#b!qem;V@Ta(l_HiQ2quaeKSbJqj#K-_u4#BL3Z1a3Kvh8SX^D-tV7 zb+eauKkLrpfLld-IImweIb0;0ngCEhAcaBiDkJVur`Z9hhfdGIYkVZCr(Tr7A5RJX< z9ek{S85avS(Yv(rcHj+h2OmJMLDPdr=)5j#Uw5`@yHB6!uEY*-gD8v_-46JS1SQr( zPJTWs*B64wuR9jY*{nU*H)EYHh1T%dZq(NY>mVzVY<6y7kSZD!{?L8d$E$BtGM*pi z>od(bmq?mBW)SJf_cy_xM6CJ0YO0srI%nQw??(Rj#d1cG20rhG@k17+cIKKkp5Kwb zZSB)DV6KUHcI=(Y2n%i%j4LJ31IHymR2}b*y*}Pu8U$|W$DNM;#Vd9=wc)-$tQ|PQ z3e%fI&6`LJ61^ z<<2@TwT!tvtgh4u0P>Xc(HFgoyrzAFF@U6*UsOc=2v z8pfB84OcDe?%#VwfaJEYpj$3vf+I%|hz6q8TdhE!H=*8d-FABiJo_$@SWb~$9E4@! z`SY_#)w!KU$DzCmR~X!Pg1ofzOBL^otH|NJcc>??IP37i@WI9Yo7%IE3`u3_`vMNJ zSJ?iY2*YT@Y~!embm8!2;^!*X+R@g`cgbzP3+|mC2FAfDI#3R}v=4jU(Y2PUTdi?x zVzI^BalV$?eL>T0OyOYcR8}Qy!mioo9l`LB*pM+d#PNZvyLT!}&#rVgc|e^f8rg4fyj~|L1&| zMwc+Vba+SFf*}4}_*FP}Gf@IeCZ~Uc|6AEo&|2IciTVD`V#fpC+ zV+PEYWL8Q#+T6IgjeezDB*6njwegjrGKa%LiZ&onAZ}%X8#ffnKW+SP-UJIxLFApcs z*Ni@4{KP(LL-4Wnl1V>L_8pCDN9(r9B!1Y`7H-&eiB6wdqN<(Wzg6k5d;NPwBfvjN z&|OmAz{WNZ&DOc6*Eum+={O4lTF5BLN13#j!H5(`nVk({@_qFY^Dtk!rw~a4`k2~3 z(WOS>5d)L=s!&lY$`@$wa1$B<>f5n(qk34)s>r$x4of{xk_z}oln1v~O9!YSB-`yf zz<%sz=~v2ptvgs1=P?TlSphgOalY^C-}8NhTatp8)~!pQLiUZ)SwU}5bviA0cvaA{ zW3{Wf_mSuPJ=K+{NIxQ+!I>8+KD{ZXQ%%Xye}vO_Ni?h>$RFK=@ev-Q{W$$Q|AYP9 z-n$wqEU`tSsf@bkwc{=!tebvguJ1JQPGA$Afq=gue7|P?&xR})m+;oPI8Bgojq!)- zq0*?FW`;w&AR!4f7we9f^m{ygt&{w_0QGysYh2=o+<-N)$Po=V*^jeee?4fK4jjEX zzVRuFEtY7WDZG*ZjE<<7h%$Ep9vcxMfs+aY3BwVYg`#Ig*&CH8f9ze(B(Igeh(jT3L?)LQA+x|`*@4rX$0 zmjQyA3xCnWt{#lC>bgjN#VSJXFKvlgM~DGKS&Mx0j8)hu|0vbfVRg$Uq}yT zVMhNJLCteRF=+i$;*K4AI>{m}sdgD7*JU%XN=Vu*A#j62(UM;9$!IHd)rfz{tp88B ztqlYfGTOoZaC{43NU!2r*6KKXU3q)6(Z#{Sa>bEywZXi(@dL6#n}XU(uhDH2RoipH zJM#XR>3qZvDVnjLR>>y_Llj3Ku?GkHF2tY0chCdJQ47;0iYZPsb zh|#qbiXyRAHK?r?-`j1jY;05_QnWP82f|h-AZeaf9)zuyGb8CkBoYikT3z4IGNVCt z|>Kh*z-e|exY7{>or-=@Fgr}|_2f76`Q zQUU29`a%B?`~biS!rw0IQ^dEs>D;mPatot_kxIz|080u4B@m=yk}~)Dx*_;_|K6W} zm&~6N4=vjpf4g^xI!oXD3$KhZ0UR%Ha1VUj{R{9@3i# z>ZKE%+3D?Ev4EOly7=kM1FSBZ>Wr=O-L?(TgeXi9kV1|%1(Iu~Ggi5Sxi&up(_n}1 za>#qf=F1#E@>$4K;L5>6N+ufpSU=LqApT7XJ0GKH|8A;s#sl>~Hz5Eb4g4+X7wpsC zt#JK@pakHf+7t5ti6Mz!%gf^T`|$tc{=@#$_;Vot+BE;?wwi*7tzx0f2oK&t(>~wr z|GTPeid2FqpoulU?fE@sozA+u%cEXV6B2=tI2B1X5jA)JMu0zW@%|o1?cEPa0ige4 zAJzA02gX%R;XJtQpiUm2v*rF1gdW+;_2xvBGaUgwTh*9lnSc~}iLal*7%uVqJP*=3 zcKg{hPB;&T4}Q_~*cvR&5NRl%J4`}LO9W;Z3Y%*)MpZDSE z{DS>8d;7=4sPSX(0Y015awwjiYMKA9aEx6@ zkmOVXELA`X8y$`Bus@?!c9FIKYk(X~yHo^>rDuN^C;(##Ano4*fM(~W2Wa{eqg)O% zH?h4Pa9|*jVA1{%;J!T<{OHI(on8l&T*i?&uEZnui@!Z_`e(oC&He|o&`)IhCkZfs zrixL9Ca#+7nZk`mqKg);vi{2SjeEMT&YN4Z$&$6q%v+?U|yQq^S#!An2 z-Ii+CrON4RF72)w+^Pn5ZcKICuU)IOvM7X%uS<2V&9%`RU3VBauDjD*jW=C%r@3|6 zr$#O$M01_)zxC|LZ}Y?akOg>6DAiL)v=z0BR;b%n)84(mpbX`Jeh1s=1xRBb;UFj) z|B@(UV^%h#>t#WkTy#$?uNnm?YmT1u*FX_nW{ zt_wDbRe+UR1L$FZ4N?#h0VFoBoyPdxK>k&At(2C@Mll0TGzORuV(|SC7su-UUr)YU z?LUN3^9T6h;^&V;Wq^=%Dlaek|Ig=&e{%o|Ap!*gNdXs(R1M!Y<$vqUG@o!-e~ys~ z_k^;Wf&Lpn-4y@N7YvPQAZ>~p z10Q)J?wroUn^@$_&T<^@c} z_ebB2@zMRI&*jPw_zkH^x=z>fZLKQa!={sBpgxkm&NzAx&o})?+*XI`2j}na?(yvX zmJ{7LXBuC+``jdBrii&Ut446v_mybqMh~T*AN#Mvzx`7n(mr;^G|$=YfrXYVvmq1h z`344v?&K#@55(Nvf>~g9zS^KEB16gfiS+aN95;=}|5Y>GW`jcY5$Z1b^-q(K z|B(9FTl@Iw7yeQd4Jgot(zo<-?E_3ffoPke%IT$cmkf8rGmlk7Yn%IQsm zM;!T~1t)bu-9JzwBoEYWkp#q~9>8mWVS@fvczEXq8^{f|wjGE<59G_HUTc_eU&K7!j?x)MwnDH6g!f6e`EF=7h645U zQ=XSwWgO4-9Z%E-FJZuavox^Q3KSoIsYyyoW!HEa_hLdQAO)jP+5MC7= zYGLI2-lu%%%`^}W$84WD*g%9g%jfm{k^kTeu`ida8y0&s7X~TK`?oa}R9&MsEByL{ zNlbt;kW^+$;uE|S8$)bG3|T(4JWT0N2>>@7~90K#FFE(-aUZE z+5mLN0Bj6viCnlyWM83nVB1Lq>@k=;pyjf95Gm>U$E)@mJ`e_{!Oqi5@$B$-+u!f3 z4;WtXo^0dC&p>iNsP4G^(cf>~k@PK} z>)*%2>A6&i@}I5`gd_ON(HBnpRN6<*ekQUwnNvs)BY#Q{ztbl(rVQt6Zflo_>zBj#VMeqfaN%CNo8!%O zgE{Ignwp^F$%Z+8wb45ajqx(rX7?`XwfM0oa#_|WbAMKRmOEfWTKgGy@@F}X{f?ma zdmWgNr!m+!@8{EoC`gurl5GL+5P*4)+G2cUDv(c-<_~uJYKNb-*Kxq3Sh<}A0KA|J zGF1Q?=NyW%3ftPoVBHXIksb1twtc#Z`-1J%-re)YwMz|>q>pLs9U~HOWcOg=x!wA!1;U53HF8K8$7D3HX-ecUmaj}`enI71GBJbJhrJBy$~`G)h>{7A0!#E27Z;$ z{Vty$%h%X;+TEXK+rG{hiMI(OObo;z|1aKT2_mEI*c=&tC7xst$U${n1m=Vzi829-*aAzk?V(s?eWs*{AzM2mMJ~yt9&0u%z(P_)E^0@lD{0lICtIq&3U%2Tt0;(~=wZ3UIim@r{u^)e za&>;Z%)`s%`<2tm>_6%vAMFWPqn{BW@@I|wbt&D|010AfJ z6@JIY<@|Px5>caKyuWeujpMU7Cw=oAAGT#J^nHX!Ml0NVSmZ;Y{qYH~9lp<-emq&g zWDb4?x}U|k9@18Z_-6ivfd2q*K}H{L(fNrT0dc|479RNyfsa9ARBTJ|Vr=`^gqehw z#QHv&2|eE^2SHy)2cbR-8Pab}>@w1SR8l?nOu@zU{12S3^FM?7u)?!%L@7JHHce6v z0puX`_kQLEkV+IeWPnp1MWLgkOHhBS`vR)49f%e-&;e4L%2oYL0XYXFPp`ScV08S* zcl-YKbpDR=_J#j{r>F3<;rLa8kpHJbZ%)eR=ds~2{bSc}r{O&m8>44dcSW*)6RX`C z6q6}@1|y2wC9(cb3}y=E7R-D@J@RXlF|&JT#BB}CP#h3b8@V=mK7u|Pr|R*9MkB+2 zA;Wf5h*87CZ~XopB6QO-dMJpb4oVySbvYW1?BWzNhyah*Lbse&0z4(pqE+MNOCuyS zv7e1v7=<_sA!W#kBh1&`=tBx``9ubTEJd2cM@agHMZH~`=qTh-+^Rzz-D5_V=N6Za zDCZA&aA)2v9d?4Q)IQYyE1ZS@4oD@3Ct;&_E_V>dSG*og;5pp-lyHh{@Y9V9kO&)b zQ8}HoP#`{?sl~K_{_F5|LQ@W2nRI*>-~9Jzicy{m*wpM2TvPzo0HZ-_T!^hW5!JWd zrX24a@)>JwI4&<)9^NX;eEe|M?1~9rc+69&<0Hov8)uIfxs;e|8AgQ+4%)pL6&~fAhr>GY-l&~~eoY)<1?n`I*M%XtaEO?ATdKwCl)g?@ap^~r z6cmm+Q0W?RE%;^9agI4ka5lMNF}_pdfPLyaR^xHI#E+V+^M$(Nh=;?z`KQV0RhvB1 z7}kAHzwzZ-n1AX!`Tal3^aMZw)u{l_tCPl;1I{l4xE-@D@aG<%rc&-cW9II#fownJsoZ{Pw&;_s>_d1)NVIlH_5LA~(s9f}czfd@?9 z7n|HE(h>S7KkI{gIV0cY@Waj`0uF0~XL0WP-fv%Sr@npHedvLLp->>M#YSOY;C;dE z8U=V@$m;SOEsq6}Og(&f@!@!v4m%~zewp%#yaCVeD4t&yu^;hJicpbu{VGQk=1;A) z`kX!L7WW1SkTjIuQLfq#@#YScUI)&V5}43I3BjB$8gf+AU$&o+txvFyz($z__x!gY z<^=%WC+yZR&B3G5GY%F-dw+EteduNr88#qcqt>^IJ@_!w`}|0K_gwuxEh6POk>-3+ z;DjK6;4A-!D22bm0wStAL%e>QrVxF?*#U#`a2dv?e7YTmVl(%+h4ddx8bAsl`d6I* z9zEFT;Atd87_eiHOFN-=+8gvfp2=I?E{Vm(2hi+H5L?;Vs~w)a1Afk*j*R5rIC>U2 zPL?qfn!iRUYj}OB@^gdxYq#$8_rn9#)%UuOKKnjTmFL11m&ZVT>6cjRKmc_h%2tRsYee#D?dYfJD<2MJ1JdQY<>T3^TQ7~pH6V}5I(r@Y;tbb($R0iKZsfcF zVjw{%InQ&tE%R{Z;V29TCJwK2zJYrs&47rJh#Y+OTZ_Qy>l-;%2?5jiN1MVTr;Xqe zEA4|W;8fw7^TVF+Zxn!4wgQP+KltjXk&+Ql0`z1=cQ@Y zgC=1~I_B{Yxjw6xFjxQGoXi}lQDEWhY$Y**50`yl|8K6d$@8~x)Yg!2xC~jrj1CJt zIri62m2kq-DihIdoz?$&WiD@Kx{NgF=MMAsUgs{1^T=5Xj%*2ETPj6V_cl*aipBpL#yso{)!UQM7WlWGm z!z_W)8?KMDkq`+6`JWw%E^H#7%GGL%TMJZuX83>ZI89}Owfu>n+j0*+wh za0L|=|5%8P$kXBQv~z14G#o0X_ay~i8FtG6hhTuazcI(^OVaBiaL}DtC!NqIYv2;j>g}Jp+F5axL%+U`X7{}1x8L1Zhrr>?e_C~bPL4(LB6Y@ z2zV%{L&_k3bN$+y|8-C@9M0dbFbNFVvsbl8KfB-er9hA!zZoC`{~Y_9sRhH~^@duZ zHhSIUFIK-!s6K7-yll^(mQjph#Y(W>|C-;mrPU~81 z<-i)F^pe6HGH`}KBJ|%$MR|e+undXevuIa0El4+TnB-fqZNtMUv`Vq^Q#rAF6 zCNtgaH9l?MuY|N*2X5VHy@zauzG*s0d?f)GE3!Hq=e8l7gf36$qFdwB9G&Aw))-{b zGW>e6Xp8hQBxW|U&kfz$BfDR|0*IHBVq1KWIQ=8%@d2)W?N6)XU4b3ZXVi8 zX=9W$d}cMx-*X<3kL~8#JYwoI=d>Q~n;-t!$2TbIpH`;7031Uf?X8V!T-JSB+wJxb zeO-8a1Lr~W0ztFIi1^G+=6RioAjZzVDBfkNFt?9PN3_6uKF^f&-5K@Ho!`Uu=fz&q z_gb@0@qexC`nx#Puje%r6Mt@=1D`Iq&pfhTyqnLVyeE?cF!AB;H_qrZFXddxvQ~AvKain&;yI=ndA}hg^JZ zfQ>&6U2(&29+cEpxpe#c{`csJm!9Va?$-d+U#oVq-btz6EvCmo5 z8@cY#e@9qHp^Gxz&f$&97S--^49YqdNr0L31eViGmZcn$5 zFBrMQfFUjfAb_Y)h{0&zierkW$I@&GBH|!L_M3YdtiPv!soBJ8#@7|^9J41%zK4+yu2`bSD1IC_L%D)*FT(@ zun5>VTpcB8g980>@VC=nOQ^ee!y4m$pJoF`RD!|Ck$i@mSk1wf#7B;s?$xiJ?64hB zjk-92cCoB564W3Uk&m;qM;44k>e&mN2zuP&+$(GcaL6c!v`dauV=PetaUc?d-Ccpg z*7}Co;_m)l%Z~M>qA|Z!(`}81Iwx$i)_0!*EgVHyFD=f-jbMe5v~DQ^gLKss6Ssf0 zk_IsvR_g|{fE^ExWF`!aiSKhNFkx*hiFPPKLIArS-xloy>4#pRlI*KBNJ=?#KKv=8 zb4Bu?PM4^Pi~IOmEDj8^%6cpwIkgKSW&uQiZsrYzs zD9{RXdqz3OwfTl8o*DvkVC1odzl3?LaL|?aG-b=Nn%Ir=miee`A<(0Mym8r}M)Lz- zuveQ@Z}+;{O_)`UbC+C~Ze9|68$CHzVg9$P+oQGAd!{M5l+`h@Vl-R}k_^#>lHl<& zMwr21Ciu1fSZSmcn1Ih@sMtFEjrg!(uQm`6L70?eaG zG+v>%(ZhT17}dv4`{8Tyt{Xkk__f|Ko@NRTTJ(DZ;eMxID(sE6b!lkOL>+F6aD8on zyh)&5BE)vX&x4_|TO95A!$A$6S2ePW zS8blw>9H`|ZX8{93sy<3YknHE*ywPmwHVkgd1GYkzE!bwUz+#ZL782sX|@eZ@5;?% z9S4jyP4)##7RGAU%jD_Op(fS1fYp;e~USDF#G8C@_c@ zV8}F(sA8iEI6p+51zm>B+l7zecM#RnIcFQWwP?IVQ34R52DsgQ-I+oz9M3zQ|?9@wO^)gEwlTv5?7&8MUyv z(t?Gq_&1mA0BcBvg3+_g<3E+~({Hb4-8R~Djm*!rlP`?zCkiqK!thx}!K@8gs~2=E z(PMJlt3{bwEi$B88pga_-MDiLV&}5k8pi5ZVY(}9S-7wbZH_LM{aSH^AEGT7k)(vs zM_gcYlw*;aHw>YxS;F1T+gqid#hmHXP&H3y7{xwU4VPx+17<(5VDZ3>;Tn$_kGO^> z-W5W3>~hD^g(2g)OpZ44emb}qzCqXa`RpP78~X}1G^(1URsLqK)M^|1%Us4;DWuXf zN;Uwt(*hz*6j~_L4XTZ$Ls~6GirBSfQBU$WN<_xdL~Vp7Z3ZlxQfRFj)kU$5SvJvX zlR<11uIr;BH4>v}#i-G$jIxqe{*~LNR{qSZqEMSA$)X}^MYA8^ZlsW;%)+M1QAlb= znn_BHjY(Lu^XlmlA_iBxa)l?|yHOfVPHUuM5i(D|Tq$ED+A^5Yo4xAv5>hmYBWeOR zMn(S%lwY59eY)k40cDaE6)~jxaFrOSm}JVJ*#uW5ga?Qy7NUe-`U zxR3#OK#eMgSpXBXhyk({NT`2>ggr~Uof~XZlo)a)WYR>6VJZtjK@)1kq?S~{WoZz` zAdxnUY>3S!s-(7}tGjDJh!_$jY+D-2q!^HJWMBb-7zD7nBND`!1ULi&0wmhev%0x$ zN@6LSYi_+5;9{625^AKD77Br^Gg?>wfD}84qb8 z1gt;_p%Fh{>4xM0pdj~z)Cv)Qrrk`(x8}_II@l+ZinsNn=Q*-dh-9YX+5D{he-F8c zzBh2^OL@Tb_so3&Xx1$LcC{iQw`|#zghg{s;hJCZy#BhjUxzr#&zvrwNFB1l5MGES9XE~nz;Cez@w_rB zTo6zMz*r95tQMl$H2#~k^U|s|W@znuEsJl>THGwS-toX`q=&36j(eZ8Fx`0v4i|1` zpvv|9@6!7~7^xjDlgXXzOrR2c}}?_2+d{^Wv7kYt%O-!I2fvq;r9}yfHc} zT1XMZY6DPOqTVeRC_4|f3V{yNeH<;(v?Uvcv5BDJ{b?c8qp@* z`U_F5xy7%jm4s5&Xr0k;xv_n%Y^66`#+FIevdHbvc+>ywu|l6k8(4}*PeV9GQ?Rpm z9KwCV06xP*C_2GG`YX`@P93*nBtT>SpO!z<`fFeE|6YZp_k@f*V=s9kZ7m9FGk-3< zIbodwARKjX6P0geTWgem3i{~E%~OTXC?n{`AbL*QvbVpp=AM_!BR^k}#{8{6w$YDo zw*$tu5AwJSNyfnD5sk4zN1sfTgCya4x@wJmO#5!NYT0c=T`=)u;q3L5ykeh>=|V1M zB3q{*g9Q&XY9Qe2iOK!i+&1hV8w>fi%E-*jiHf7y;Gk|bY7dp-qehJ0F}YA!P~H_t zHj0-uRYj~@s<6DM$qV?OBk=cKEF}c=i1uq{VdhXT*d0?RJ>t+FL6=RjsR)FCgn%4Slu}B*<89kIUfb&5eEs#x_)ovn zRw3kgTfA{Sukd0fy%vXS?Ag#e4UxCfn zAc^5Mw6TKj(tvQ?e(u!iJ}?>vd_sl{=%qnjqsJ#Y_Zw$!Gw#~Jy0^LrBQ^$?kz-~E zORr-CK;3xG-QGbbSs5Fo|E>c1@ zcQG-HsMKl9!-eYd&A|(r+y(d0rMFO0jLDf?h?4zaMZ+7yI9j>wc!`PaT!BoHLY>_KLILQ zt(e&N#G)iH8Ge%>e%d~bq35audUdYc;+_9GK0K^FCygQNuB>fx#k%%pFAf$!R#{Kq zM2--HHL`TR@n;PJ;6^aC90%RO-hK5o`Au4{zoXFgia#uce6krDb*219gb|<%_IrF) z)%Krvk7Cca!tw1sUrOZf;4bV(>T8mtl+Ns=8JY8TC%aWM-zRwdF1#w!k_13FiMK|pb$Qmt?96*Z;ih(Thk&z*ivx`^NHelHg9ULeD%3i~<8w*wSoj;jF1BuSsA#Ci)0fIb3iNCn# zs@Yt6h~)#0?g9|8>+tp-&&HqVa?eZ_9UHIQ2%U)}vZ3|J?Jzp(+upCn8{F>_9i{Ly z{2n6*kEA*9&^n|BLx@5FOjy7e3)&_QdiH1`>9jD1r0S`w;dtEZ9y(+L@D3qlMhTtz zU@d->Ii@zDKqMe}`20f-=DIpoF05~qHkn%_KHVB#L;eBef!(+VaREpq zXjg!mz#v#B*!DB5bajqA(y5}|)Bd9&q(KAj7)&A$U%>fee_xSmg?U7OLXwIQlBj^A zAK=!9Ay+k6vI-pq9vxePCY*aU?\%n{)3+5CUdga1G!S`Y~&U>IM%QOF7tA;MJ1 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 literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/079-jiffies64.bz2 b/obsolete-buildroot/sources/kernel-patches/079-jiffies64.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1b6873d3ec7959fbc48e641ee120dd47db6dfc44 GIT binary patch literal 5066 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 literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/089-no-touch-makedep.bz2 b/obsolete-buildroot/sources/kernel-patches/089-no-touch-makedep.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2e413ccafc9b55521c5ea06325e763b30b2984ff GIT binary patch literal 858 zcmV-g1Eu^zT4*^jL0KkKS+Oy#D*yo_Uw}d|e*gdbL5PSBzwh7vPy<-nT5aw^+d(KP zkWELXnmsA0=^A+^o6}VC8bcxK29HoNQ)!`1PgB(O0gwQCfY1l14FCpeA}OJhMuDKn z00000XdJ>|696U?38nx56DFDl5+zR|CzC38)W)WoOlb^(rV}BEF{wv^XTrXs84eYU z6vRx#s3Im@r6j~CltO)d6qJxOBp^))1RyePo6z9^;Qoo3h^Pu(6v;YzwXI`P%T;iq zgS`p?RCN`uo-AU<;s^*D&z(>mxA-j2j!Z@v1cC+`h--(#YT~ywezHiG)wz3cZ2uy~ z%ziCwWdc1`+;3BM?S`X6U)+Wf7KB?wZ!{E4W&N=TQaKv_I)rg5ij(OOf~_`I=_4W+ zb%4qD!2f)VSRQ<~yz#y)zoy46a(@9a^QPm$7Q zW3#6CG;_s>W;E8~Flg1gg=^Sj_PZ7%&ik20KuYk#^BUYmG~5e-k=Q@mj^JX3mUZW=1s8DwcPfR7?X%NK};& zR_Kt*s5MP)V4ehANy*};B83=zN;mQpzQT+VdPn)q4Tt<)$rRy2Ld3?jtPTK%-T(jq literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/kernel-patches/100_VERSION.bz2 b/obsolete-buildroot/sources/kernel-patches/100_VERSION.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..54d2e6571e4720adf6cde7ea16fdc7c9d11d5977 GIT binary patch literal 236 zcmV30MG`3D4LBF{YmX9r;|~&F){=7P3j@F9-)!@Ef+VJWHahOk;Eqj zkSGX;q%8`R2cYo?GvF+-2vJ;DSpm#qFM!>wSYLi0#lZng1uiNaSQ-e9w!>=Ci0X%q zi{dE*CkhUmG;Z@Q(A#Bj98d5chI*@zV=9Uiz mDOy=Moea;C{pM5|4;vv)u}M~DXAXyB_`8xR!i0rg47OmE&|e?` literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/libfloat.patch b/obsolete-buildroot/sources/libfloat.patch new file mode 100644 index 0000000000..90459a89e6 --- /dev/null +++ b/obsolete-buildroot/sources/libfloat.patch @@ -0,0 +1,45 @@ +diff -urN libfloat-dist/Makefile libfloat/Makefile +--- libfloat-dist/Makefile 2003-10-26 00:33:45.000000000 -0500 ++++ libfloat/Makefile 2003-10-26 01:07:26.000000000 -0500 +@@ -1,7 +1,7 @@ + # Makefile for the Linux soft-float library + +-CC=gcc -O2 -freg-struct-return -fomit-frame-pointer -D__LIBFLOAT__ +-#CC=gcc -g -O2 -freg-struct-return -D__LIBFLOAT__ ++CFLAGS= -O2 -freg-struct-return -fomit-frame-pointer -D__LIBFLOAT__ -msoft-float ++LIBGCC=$(shell $(CC) -print-libgcc-file-name) + AR=ar + + all: libfloat.a libfloat.so.1 +@@ -12,24 +11,24 @@ + + libfloat.so.1: softfloat.os fplib_glue.os + rm -f libfloat.so.1 +- gcc -shared -Wl,-soname,libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1 ++ $(LD) -shared -soname=libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1 $(LIBGCC) + + softfloat.o: softfloat/bits64/softfloat.c +- $(CC) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c ++ $(CC) $(CFLAGS) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c + + fplib_glue.o: fplib_glue.S +- $(CC) -c -o fplib_glue.o fplib_glue.S ++ $(CC) $(CFLAGS) -c -o fplib_glue.o fplib_glue.S + + softfloat.os: softfloat/bits64/softfloat.c +- $(CC) -fpic -c -o softfloat.os -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c ++ $(CC) $(CFLAGS) -fpic -c -o softfloat.os -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c + + fplib_glue.os: fplib_glue.S +- $(CC) -fpic -c -o fplib_glue.os fplib_glue.S ++ $(CC) $(CFLAGS) -fpic -c -o fplib_glue.os fplib_glue.S + + install: libfloat.a libfloat.so.1 + cp -a libfloat.a $(DESTDIR)/usr/lib +- cp -a libfloat.so.1 $(DESTDIR)/usr/lib +- cd $(DESTDIR)/usr/lib; ln -s libfloat.so.1 libfloat.so ++ cp -a libfloat.so.1 $(DESTDIR)/lib ++ cd $(DESTDIR)/lib; ln -s libfloat.so.1 libfloat.so + #ldconfig + + clean: diff --git a/obsolete-buildroot/sources/libglib_configure_1.2.10.bz2 b/obsolete-buildroot/sources/libglib_configure_1.2.10.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..883a8009d497b04db84d2cf8352bbe94f4f1e244 GIT binary patch literal 8884 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 C*zo!Q literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/linux.config b/obsolete-buildroot/sources/linux.config new file mode 100644 index 0000000000..e33656a9ff --- /dev/null +++ b/obsolete-buildroot/sources/linux.config @@ -0,0 +1,877 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +# CONFIG_SBUS is not set +CONFIG_UID16=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Processor type and features +# +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +CONFIG_MELAN=y +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_L1_CACHE_SHIFT=4 +CONFIG_X86_USE_STRING_486=y +CONFIG_X86_ALIGNMENT_16=y +CONFIG_X86_F00F_WORKS_OK=y +# CONFIG_X86_MCE is not set +# CONFIG_TOSHIBA is not set +# CONFIG_I8K is not set +# CONFIG_MICROCODE is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set +# CONFIG_EDD is not set +CONFIG_NOHIGHMEM=y +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set +# CONFIG_HIGHMEM is not set +CONFIG_MATH_EMULATION=y +CONFIG_MTRR=y +# CONFIG_SMP is not set +# CONFIG_X86_UP_APIC is not set +# CONFIG_X86_UP_IOAPIC is not set +# CONFIG_X86_TSC_DISABLE is not set + +# +# General setup +# +CONFIG_NET=y +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_ISA=y +CONFIG_PCI_NAMES=y +CONFIG_EISA=y +CONFIG_MCA=y +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +CONFIG_CARDBUS=y +CONFIG_TCIC=y +CONFIG_I82092=y +CONFIG_I82365=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=y +# CONFIG_HOTPLUG_PCI_COMPAQ is not set +# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_OOM_KILLER is not set +CONFIG_PM=y +CONFIG_APM=y +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +CONFIG_APM_DO_ENABLE=y +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +CONFIG_APM_RTC_IS_GMT=y +CONFIG_APM_ALLOW_INTS=y +CONFIG_APM_REAL_MODE_POWER_OFF=y + +# +# ACPI Support +# +# CONFIG_ACPI is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_PS2 is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_CISS_MONITOR_THREAD is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_BLK_STATS is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=y +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +# CONFIG_IP_ROUTE_VERBOSE is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +CONFIG_INET_ECN=y +# CONFIG_SYN_COOKIES is not set + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=y +CONFIG_IP_NF_FTP=y +# CONFIG_IP_NF_AMANDA is not set +CONFIG_IP_NF_TFTP=y +CONFIG_IP_NF_IRC=y +CONFIG_IP_NF_QUEUE=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_LIMIT=y +CONFIG_IP_NF_MATCH_MAC=y +CONFIG_IP_NF_MATCH_PKTTYPE=y +CONFIG_IP_NF_MATCH_MARK=y +CONFIG_IP_NF_MATCH_MULTIPORT=y +CONFIG_IP_NF_MATCH_TOS=y +CONFIG_IP_NF_MATCH_RECENT=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_DSCP=y +CONFIG_IP_NF_MATCH_AH_ESP=y +CONFIG_IP_NF_MATCH_LENGTH=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_MATCH_TCPMSS=y +CONFIG_IP_NF_MATCH_HELPER=y +CONFIG_IP_NF_MATCH_STATE=y +CONFIG_IP_NF_MATCH_CONNTRACK=y +CONFIG_IP_NF_MATCH_UNCLEAN=y +CONFIG_IP_NF_MATCH_OWNER=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_TARGET_MIRROR=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=y +CONFIG_IP_NF_NAT_IRC=y +CONFIG_IP_NF_NAT_FTP=y +CONFIG_IP_NF_NAT_TFTP=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_TARGET_TOS=y +CONFIG_IP_NF_TARGET_ECN=y +CONFIG_IP_NF_TARGET_DSCP=y +CONFIG_IP_NF_TARGET_MARK=y +CONFIG_IP_NF_TARGET_LOG=y +CONFIG_IP_NF_TARGET_ULOG=y +CONFIG_IP_NF_TARGET_TCPMSS=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y + +# +# IP: Virtual Server Configuration +# +# CONFIG_IP_VS is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=y +# CONFIG_IP_SCTP is not set +# CONFIG_SCTP_HMAC_NONE is not set +CONFIG_SCTP_HMAC_SHA1=y +# CONFIG_SCTP_HMAC_MD5 is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set + +# +# +# +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +CONFIG_BRIDGE=y +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CBQ=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_CSZ=y +CONFIG_NET_SCH_HFSC=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_SCH_RED=y +CONFIG_NET_SCH_SFQ=y +CONFIG_NET_SCH_TEQL=y +CONFIG_NET_SCH_TBF=y +CONFIG_NET_SCH_GRED=y +CONFIG_NET_SCH_DSMARK=y +CONFIG_NET_SCH_INGRESS=y +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=y +CONFIG_NET_CLS_ROUTE4=y +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_NET_CLS_RSVP=y +CONFIG_NET_CLS_RSVP6=y +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set +# CONFIG_PHONE_IXJ is not set +# CONFIG_PHONE_IXJ_PCMCIA is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_IDEDISK_STROKE=y +CONFIG_BLK_DEV_IDECS=m +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_BLK_DEV_GENERIC=y +CONFIG_IDEPCI_SHARE_IRQ=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_IDEDMA=y +CONFIG_IDEDMA_PCI_WIP=y +# CONFIG_BLK_DEV_ADMA100 is not set +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_WDC_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_AMD74XX_OVERRIDE is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_HPT34X_AUTODMA is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_PDC202XX_BURST is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_RZ1000 is not set +# CONFIG_BLK_DEV_SC1200 is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_IDEDMA_IVB is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set +# CONFIG_BLK_DEV_ATARAID_MEDLEY is not set +# CONFIG_BLK_DEV_ATARAID_SII is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set +# CONFIG_FUSION_BOOT is not set +# CONFIG_FUSION_ISENSE is not set +# CONFIG_FUSION_CTL is not set +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_PCI is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=m +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +CONFIG_TUN=y +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +# CONFIG_SKMC is not set +# CONFIG_NE2_MCA is not set +# CONFIG_IBMLANA is not set +CONFIG_NET_PCI=y +# CONFIG_PCNET32 is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set +# CONFIG_B44 is not set +# CONFIG_CS89x0 is not set +# CONFIG_TULIP is not set +# CONFIG_DE4X5 is not set +# CONFIG_DGRS is not set +# CONFIG_DM9102 is not set +# CONFIG_EEPRO100 is not set +# CONFIG_EEPRO100_PIO is not set +# CONFIG_E100 is not set +# CONFIG_LNE390 is not set +# CONFIG_FEALNX is not set +CONFIG_NATSEMI=y +# CONFIG_NE2K_PCI is not set +# CONFIG_FORCEDETH is not set +# CONFIG_NE3210 is not set +# CONFIG_ES3210 is not set +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +# CONFIG_8139TOO_8129 is not set +# CONFIG_8139_OLD_RX_RESET is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_SUNDANCE_MMIO is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set +# CONFIG_VIA_RHINE_MMIO is not set +# CONFIG_WINBOND_840 is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y +# CONFIG_STRIP is not set +# CONFIG_WAVELAN is not set +# CONFIG_ARLAN is not set +# CONFIG_AIRONET4500 is not set +# CONFIG_AIRONET4500_NONCS is not set +# CONFIG_AIRONET4500_PROC is not set +# CONFIG_AIRO is not set +CONFIG_HERMES=m +CONFIG_HOSTAP=m +# CONFIG_PLX_HERMES is not set +# CONFIG_TMD_HERMES is not set +# CONFIG_PCI_HERMES is not set +# CONFIG_HOSTAP_PLX is not set +# CONFIG_HOSTAP_PCI is not set + +# +# Wireless Pcmcia cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_HOSTAP_CS=m +# CONFIG_AIRO_CS is not set +# CONFIG_PCMCIA_ATMEL is not set +CONFIG_NET_WIRELESS=y + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +# CONFIG_NET_PCMCIA is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_UINPUT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# + +# +# Input core support is needed for joysticks +# +# CONFIG_QIC02_TAPE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IPMI_PANIC_EVENT is not set +# CONFIG_IPMI_DEVICE_INTERFACE is not set +# CONFIG_IPMI_KCS is not set +# CONFIG_IPMI_WATCHDOG is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_SCx200 is not set +# CONFIG_SCx200_GPIO is not set +CONFIG_AMD_RNG=y +# CONFIG_INTEL_RNG is not set +CONFIG_HW_RANDOM=y +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +CONFIG_RTC=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set + +# +# Direct Rendering Manager (XFree86 DRI support) +# +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# +# CONFIG_PCMCIA_SERIAL_CS is not set +# CONFIG_SYNCLINK_CS is not set +# CONFIG_MWAVE is not set +# CONFIG_OBMOUSE is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +CONFIG_EXT3_FS=y +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +# CONFIG_UMSDOS_FS is not set +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_TMPFS=y +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_EXT2_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set +# CONFIG_XFS_FS is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_TRACE is not set +# CONFIG_XFS_DEBUG is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +# CONFIG_NFS_FS is not set +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_DIRECTIO is not set +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_NFSD_TCP is not set +# CONFIG_SUNRPC is not set +# CONFIG_LOCKD is not set +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Console drivers +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_VIDEO_SELECT is not set +# CONFIG_MDA_CONSOLE is not set + +# +# Frame-buffer support +# +# CONFIG_FB is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Support for USB gadgets +# +# CONFIG_USB_GADGET is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +CONFIG_LOG_BUF_SHIFT=0 + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_OPTIMIZE_FOR_SIZE=y +CONFIG_CRC32=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +# CONFIG_FW_LOADER is not set diff --git a/obsolete-buildroot/sources/ltp-testsuite.patch b/obsolete-buildroot/sources/ltp-testsuite.patch new file mode 100644 index 0000000000..fed728e97f --- /dev/null +++ b/obsolete-buildroot/sources/ltp-testsuite.patch @@ -0,0 +1,59 @@ +--- ltp-full-20031002/testcases/kernel/syscalls/fmtmsg/Makefile.orig 2003-10-02 19:18:10.000000000 -0600 ++++ ltp-full-20031002/testcases/kernel/syscalls/fmtmsg/Makefile 2003-10-02 19:18:32.000000000 -0600 +@@ -24,7 +24,7 @@ + LOADLIBES+= -L../../../../lib -lltp + + SRCS=$(wildcard *.c) +-TARGETS=$(patsubst %.c,%,$(SRCS)) ++TARGETS=#$(patsubst %.c,%,$(SRCS)) + + all: $(TARGETS) + +--- ltp-full-20031002/testcases/kernel/syscalls/profil/Makefile.orig 2003-10-02 19:27:53.000000000 -0600 ++++ ltp-full-20031002/testcases/kernel/syscalls/profil/Makefile 2003-10-02 19:28:02.000000000 -0600 +@@ -23,7 +23,7 @@ + LOADLIBES+= -L../../../../lib -lltp + + SRCS=$(wildcard *.c) +-TARGETS=$(patsubst %.c,%,$(SRCS)) ++TARGETS=#$(patsubst %.c,%,$(SRCS)) + + all: $(TARGETS) + +--- ltp-full-20031002/testcases/network/rpc/rpc01/Makefile.orig 2003-10-02 19:36:51.000000000 -0600 ++++ ltp-full-20031002/testcases/network/rpc/rpc01/Makefile 2003-10-02 19:37:03.000000000 -0600 +@@ -2,7 +2,7 @@ + LDLIBS += + + SRCS=$(wildcard *.c) +-TARGETS=$(patsubst %.c,%,$(SRCS)) ++TARGETS=#$(patsubst %.c,%,$(SRCS)) + + all: $(TARGETS) + +--- ltp-full-20031002/tools/netpipe-2.4-ipv6/Makefile.orig 2003-11-07 16:41:39.000000000 -0700 ++++ ltp-full-20031002/tools/netpipe-2.4-ipv6/Makefile 2003-11-07 16:42:41.000000000 -0700 +@@ -10,7 +10,7 @@ + DRIV_OBJ = netpipe.o + INCLUDES = netpipe.h + # Default target is just TCP +-TARGETS = NPtcp-ipv6 ++TARGETS = #NPtcp-ipv6 + # If you have TCP, MPI and PVM + #TARGETS = NPtcp NPmpi NPpvm + CFLAGS += -O -Wall +@@ -28,12 +28,12 @@ + targets: $(TARGETS) + + install: +- @ln -f NPtcp-ipv6 ../../testcases/bin ++ #@ln -f NPtcp-ipv6 ../../testcases/bin + # + # This section of the Makefile is for compiling the binaries + # + +-TCP: NPtcp-ipv6 ++TCP: #NPtcp-ipv6 + @echo 'NPtcp has been built.' + + NPtcp-ipv6: NPtcp.o TCP.o diff --git a/obsolete-buildroot/sources/lzo-cross-compile.patch b/obsolete-buildroot/sources/lzo-cross-compile.patch new file mode 100644 index 0000000000..68a3d0449e --- /dev/null +++ b/obsolete-buildroot/sources/lzo-cross-compile.patch @@ -0,0 +1,43 @@ +For some reason the lzo autoconf script uses a local macro that does +a test for cross-compiles, and assumes that if the build target name +and the host target name are the same that --host was not specified to +the configure script. In the uClibc buildroot, this is not the case. + +--- lzo-1.08/aclocal.m4 2002-07-12 18:31:52.000000000 -0700 ++++ lzo-1.08/aclocal.m4.new 2004-03-10 15:32:42.000000000 -0700 +@@ -205,12 +205,6 @@ + [ + AC_REQUIRE([AC_PROG_CC]) + +-if test "X$cross_compiling" = Xyes; then +- if test "X$build" = "X$host"; then +- AC_MSG_ERROR([you are cross compiling - please use the \`--host=' option]) +- fi +-fi +- + ]) + + +--- lzo-1.08/configure-dist 2004-03-11 02:18:28.000000000 -0600 ++++ lzo-1.08/configure 2004-03-11 02:19:16.000000000 -0600 +@@ -2282,13 +2282,13 @@ + + + +-if test "X$cross_compiling" = Xyes; then +- if test "X$build" = "X$host"; then +- { { echo "$as_me:$LINENO: error: you are cross compiling - please use the \`--host=' option" >&5 +-echo "$as_me: error: you are cross compiling - please use the \`--host=' option" >&2;} +- { (exit 1); exit 1; }; } +- fi +-fi ++#if test "X$cross_compiling" = Xyes; then ++# if test "X$build" = "X$host"; then ++# { { echo "$as_me:$LINENO: error: you are cross compiling - please use the \`--host=' option" >&5 ++#echo "$as_me: error: you are cross compiling - please use the \`--host=' option" >&2;} ++# { (exit 1); exit 1; }; } ++# fi ++#fi + + + diff --git a/obsolete-buildroot/sources/mime.types b/obsolete-buildroot/sources/mime.types new file mode 100644 index 0000000000..53f6ea1011 --- /dev/null +++ b/obsolete-buildroot/sources/mime.types @@ -0,0 +1,205 @@ +############################################################################### +# +# MIME-TYPES and the extensions that represent them +# +# This file is part of the "mime-support" package. Please send email (not a +# bug report) to mime-support@packages.debian.org if you would like new types +# and/or extensions to be added. +# +# Note: Compression schemes like "gzip", "bzip", and "compress" are not +# actually "mime-types". They are "encodings" and hence must _not_ have +# entries in this file to map their extensions. The "mime-type" of an +# encoded file refers to the type of data that has been encoded, not the +# type of the encoding. +# +############################################################################### + + +application/activemessage +application/andrew-inset +application/applefile +application/atomicmail +application/cu-seeme csm cu +application/dca-rft +application/dec-dx +application/dsptype tsp +application/futuresplash spl +application/ghostview +application/mac-binhex40 hqx +application/macwriteii +application/msaccess mdb +application/msword doc dot +application/news-message-id +application/news-transmission +application/octet-stream bin +application/oda oda +application/pdf pdf +application/pgp-signature pgp +application/postscript ps ai eps +application/remote-printing +application/rtf rtf +application/slate +application/vnd.ms-excel xls xlb +application/vnd.ms-powerpoint ppt pps pot +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/wita +application/wordperfect5.1 wp5 +application/zip zip +application/x-123 wk +application/x-bcpio bcpio +application/x-chess-pgn pgn +application/x-core +application/x-cpio cpio +application/x-csh +application/x-debian-package deb +application/x-director dcr dir dxr +application/x-dms dms +application/x-dvi dvi +application/x-executable +application/x-font pfa pfb gsf pcf pcf.Z +application/x-gnumeric gnumeric +application/x-gtar gtar tgz +application/x-hdf hdf +application/x-httpd-php phtml pht php +application/x-httpd-php3 php3 +application/x-httpd-php3-source phps +application/x-httpd-php3-preprocessed php3p +application/x-httpd-php4 php4 +application/x-ica ica +application/x-java class +application/x-javascript js +application/x-kdelnk +application/x-kchart chrt +application/x-killustrator kil +application/x-kpresenter kpr kpt +application/x-kspread ksp +application/x-kword kwd kwt +application/x-latex latex +application/x-lha lha +application/x-lzh lzh +application/x-lzx lzx +application/x-maker frm maker frame fm fb book fbdoc +application/x-mif mif +application/x-msdos-program com exe bat dll +application/x-msi msi +application/x-netcdf nc cdf +application/x-ns-proxy-autoconfig pac +application/x-object o +application/x-ogg ogg +application/x-oz-application oza +application/x-perl pl pm +application/x-redhat-package-manager rpm +application/x-rx +application/x-sh +application/x-shar shar +application/x-shellscript +application/x-shockwave-flash swf swfl +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl +application/x-tex +application/x-tex-gf gf +application/x-tex-pk pk PK +application/x-texinfo texinfo texi +application/x-trash ~ % bak old sik +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x-wingz wz + +audio/basic au snd +audio/midi mid midi +audio/mpeg mpga mpega mp2 mp3 +audio/mpegurl m3u +audio/prs.sid sid +audio/x-aiff aif aiff aifc +audio/x-gsm gsm +audio/x-pn-realaudio ra rm ram +audio/x-wav wav + +image/bitmap bmp +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/pcx pcx +image/png png +image/tiff tiff tif +image/vnd.wap.wbmp wbmp +image/x-cmu-raster ras +image/x-coreldraw cdr +image/x-coreldrawpattern pat +image/x-coreldrawtemplate cdt +image/x-corelphotopaint cpt +image/x-jng jng +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd + +inode/chardevice +inode/blockdevice +inode/directory-locked +inode/directory +inode/fifo +inode/socket + +message/external-body +message/news +message/partial +message/rfc822 + +multipart/alternative +multipart/appledouble +multipart/digest +multipart/mixed +multipart/parallel + +text/comma-separated-values csv +text/css css +text/english +text/html htm html xhtml +text/mathml mml +text/plain txt text diff +text/richtext rtx +text/tab-separated-values tsv +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/xml xml +text/x-c++hdr h++ hpp hxx hh +text/x-c++src c++ cpp cxx cc +text/x-chdr h +text/x-crontab +text/x-csh csh +text/x-csrc c +text/x-java java +text/x-makefile +text/x-moc moc +text/x-pascal p pas +text/x-setext etx +text/x-sh sh +text/x-tcl tcl tk +text/x-tex tex ltx sty cls +text/x-vcalendar vcs +text/x-vcard vcf + +video/dl dl +video/fli fli +video/gl gl +video/mpeg mpeg mpg mpe +video/quicktime qt mov +video/x-mng mng +video/x-ms-asf asf asx +video/x-msvideo avi +video/x-sgi-movie movie + +x-world/x-vrml vrm vrml wrl diff --git a/obsolete-buildroot/sources/mrouted-sys_errlist.patch b/obsolete-buildroot/sources/mrouted-sys_errlist.patch new file mode 100644 index 0000000000..8498dc743f --- /dev/null +++ b/obsolete-buildroot/sources/mrouted-sys_errlist.patch @@ -0,0 +1,44 @@ +Patches from Kevin P. Fleming . + +--- mrouted-3.9-beta3.orig/main.c~ 2004-03-10 19:00:38.000000000 -0700 ++++ mrouted-3.9-beta3.orig/main.c 2004-03-10 19:02:33.000000000 -0700 +@@ -1001,10 +1001,8 @@ + thyme->tm_min, thyme->tm_sec, now.tv_usec / 1000, msg); + if (syserr == 0) + fprintf(stderr, "\n"); +- else if (syserr < sys_nerr) +- fprintf(stderr, ": %s\n", sys_errlist[syserr]); + else +- fprintf(stderr, ": errno %d\n", syserr); ++ fprintf(stderr, ": %s\n", strerror(syserr)); + } + + /* +--- mrouted-3.9-beta3.orig/mrinfo.c~ 1998-02-28 20:05:20.000000000 -0700 ++++ mrouted-3.9-beta3.orig/mrinfo.c 2004-03-10 19:01:49.000000000 -0700 +@@ -159,10 +159,8 @@ + vfprintf(stderr, fmt, ap); + if (syserr == 0) + fprintf(stderr, "\n"); +- else if (syserr < sys_nerr) +- fprintf(stderr, ": %s\n", sys_errlist[syserr]); + else +- fprintf(stderr, ": errno %d\n", syserr); ++ fprintf(stderr, ": %s\n", strerror(syserr)); + } + + if (severity <= LOG_ERR) +--- mrouted-3.9-beta3.orig/mapper.c~ 1998-01-05 18:57:47.000000000 -0700 ++++ mrouted-3.9-beta3.orig/mapper.c 2004-03-10 19:02:04.000000000 -0700 +@@ -197,10 +197,8 @@ + vfprintf(stderr, fmt, ap); + if (syserr == 0) + fprintf(stderr, "\n"); +- else if (syserr < sys_nerr) +- fprintf(stderr, ": %s\n", sys_errlist[syserr]); + else +- fprintf(stderr, ": errno %d\n", syserr); ++ fprintf(stderr, ": %s\n", strerror(syserr)); + } + + if (severity <= LOG_ERR) diff --git a/obsolete-buildroot/sources/netkittelnet.patch b/obsolete-buildroot/sources/netkittelnet.patch new file mode 100644 index 0000000000..c894c2abd8 --- /dev/null +++ b/obsolete-buildroot/sources/netkittelnet.patch @@ -0,0 +1,171 @@ +--- netkit-telnet-0.17/configure Thu Apr 11 10:40:58 2002 ++++ FIXEDnetkittelnet/configure Thu Apr 11 10:39:59 2002 +@@ -78,7 +78,6 @@ + for TRY in egcs gcc g++ CC c++ cc; do + ( + $TRY __conftest.c -o __conftest || exit 1; +- ./__conftest || exit 1; + ) >/dev/null 2>&1 || continue; + CC=$TRY + break; +@@ -94,7 +93,6 @@ + echo -n 'Checking if C compiler works... ' + if ( + $CC __conftest.c -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo 'yes' + else +@@ -125,7 +123,6 @@ + for TRY in egcs gcc g++ CC c++ cc; do + ( + $TRY __conftest.cc -o __conftest || exit 1; +- ./__conftest || exit 1; + ) >/dev/null 2>&1 || continue; + CXX=$TRY + break; +@@ -141,7 +138,6 @@ + echo -n 'Checking if C++ compiler works... ' + if ( + $CXX __conftest.cc -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo 'yes' + else +@@ -278,13 +274,11 @@ + EOF + if ( + $CXX $CXXFLAGS __conftest.cc -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo 'yes' + else + if ( + $CXX $CXXFLAGS -D__USE_BSD_SIGNAL __conftest.cc -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo '-D__USE_BSD_SIGNAL' + CFLAGS="$CFLAGS -D__USE_BSD_SIGNAL" +@@ -292,6 +286,7 @@ + else + echo 'no' + echo 'This package needs BSD signal semantics to run.' ++ echo "$CXX $CXXFLAGS -D__USE_BSD_SIGNAL __conftest.cc -o __conftest failed" + rm -f __conftest* + exit + fi +@@ -330,31 +325,6 @@ + echo 'no' + fi + fi +- +-if [ x$NCURSES != x ]; then +- LIBTERMCAP=-lncurses +-else +- echo -n 'Checking for traditional termcap... ' +-cat <__conftest.cc +-#include +-#include +-int main(void) { +- tgetent(NULL, NULL); return 0; +-} +- +-EOF +- if ( +- $CXX $CXXFLAGS __conftest.cc -ltermcap -o __conftest || exit 1 +- ) >/dev/null 2>&1; then +- echo '-ltermcap' +- LIBTERMCAP=-ltermcap +- else +- echo 'not found' +- echo 'This package needs termcap to run.' +- rm -f __conftest* +- exit +- fi +-fi + rm -f __conftest* + + ################################################## +@@ -468,7 +438,6 @@ + else + if ( + $CXX $CXXFLAGS -D_GNU_SOURCE __conftest.cc -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo '-D_GNU_SOURCE' + CFLAGS="$CFLAGS -D_GNU_SOURCE" +@@ -501,20 +470,17 @@ + EOF + if ( + $CXX $CXXFLAGS __conftest.cc $LIBBSD -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo 'ok' + else + if ( + $CXX $CXXFLAGS __conftest.cc -lsnprintf $LIBBSD -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo '-lsnprintf' + LIBS="$LIBS -lsnprintf" + else + if ( + $CXX $CXXFLAGS __conftest.cc -ldb $LIBBSD -o __conftest || exit 1 +- ./__conftest || exit 1 + ) >/dev/null 2>&1; then + echo '-ldb' + LIBS="$LIBS -ldb" +diff -urN netkit-telnet-0.17/telnetd/state.c netkit-telnet-0.17-dm/telnetd/state.c +--- netkit-telnet-0.17/telnetd/state.c 1999-12-12 11:41:44.000000000 -0800 ++++ netkit-telnet-0.17-dm/telnetd/state.c 2003-07-23 19:20:38.000000000 -0700 +@@ -43,10 +43,10 @@ + + static int envvarok(char *varp); + +-static unsigned char doopt[] = { IAC, DO, '%', 'c', 0 }; +-static unsigned char dont[] = { IAC, DONT, '%', 'c', 0 }; +-unsigned char will[] = { IAC, WILL, '%', 'c', 0 }; +-unsigned char wont[] = { IAC, WONT, '%', 'c', 0 }; ++//static unsigned char doopt[] = { IAC, DO, '%', 'c', 0 }; ++//static unsigned char dont[] = { IAC, DONT, '%', 'c', 0 }; ++//unsigned char will[] = { IAC, WILL, '%', 'c', 0 }; ++//unsigned char wont[] = { IAC, WONT, '%', 'c', 0 }; + + /* + * Buffer for sub-options, and macros +@@ -422,7 +422,7 @@ + set_his_want_state_will(option); + do_dont_resp[option]++; + } +- netoprintf((char *)doopt, option); ++ netoprintf( "%c%c%c", IAC, DO, option ); + + DIAG(TD_OPTIONS, printoption("td: send do", option)); + } +@@ -632,7 +632,7 @@ + set_his_want_state_wont(option); + do_dont_resp[option]++; + } +- netoprintf((char *) dont, option); ++ netoprintf ( "%c%c%c", IAC, DONT, option ); + + DIAG(TD_OPTIONS, printoption("td: send dont", option)); + } +@@ -769,7 +769,7 @@ + set_my_want_state_will(option); + will_wont_resp[option]++; + } +- netoprintf((char *) will, option); ++ netoprintf( "%c%c%c", IAC, WILL, option); + + DIAG(TD_OPTIONS, printoption("td: send will", option)); + } +@@ -917,7 +917,7 @@ + set_my_want_state_wont(option); + will_wont_resp[option]++; + } +- netoprintf((char *)wont, option); ++ netoprintf( "%c%c%c", IAC, WONT, option); + + DIAG(TD_OPTIONS, printoption("td: send wont", option)); + } diff --git a/obsolete-buildroot/sources/netsnmp.patch b/obsolete-buildroot/sources/netsnmp.patch new file mode 100644 index 0000000000..076592bd8e --- /dev/null +++ b/obsolete-buildroot/sources/netsnmp.patch @@ -0,0 +1,32 @@ +diff -urN net-snmp-5.1-dist/agent/mibgroup/host/hr_system.c net-snmp-5.1/agent/mibgroup/host/hr_system.c +--- net-snmp-5.1-dist/agent/mibgroup/host/hr_system.c 2003-02-28 22:35:13.000000000 -0600 ++++ net-snmp-5.1/agent/mibgroup/host/hr_system.c 2004-03-31 22:06:05.000000000 -0600 +@@ -286,7 +286,11 @@ + current user */ + if (kill(utmp_p->ut_pid, 0) == -1 && errno == ESRCH) { + utmp_p->ut_type = DEAD_PROCESS; ++#if HAVE_UTMPX_H + pututxline(utmp_p); ++#else ++ pututline(utmp_p); ++#endif + continue; + } + ++total; +diff -urN net-snmp-5.1-dist/configure.in net-snmp-5.1/configure.in +--- net-snmp-5.1-dist/configure.in 2004-03-31 21:59:14.000000000 -0600 ++++ net-snmp-5.1/configure.in 2004-03-31 22:06:05.000000000 -0600 +@@ -1865,13 +1865,8 @@ + if test $cross_compiling = yes; then + if test $with_endianness = "big"; then + AC_DEFINE(WORDS_BIGENDIAN) +- elif test -z $with_endianness; then +- AC_MSG_ERROR([You are cross-compiling, but you have not specified the target's endianness]) + fi + else +- if test $with_endianness; then +- AC_MSG_ERROR([Endianness has been specified, but you are not cross-compiling.]) +- fi + AC_C_BIGENDIAN + fi + diff --git a/obsolete-buildroot/sources/openssh.patch b/obsolete-buildroot/sources/openssh.patch new file mode 100644 index 0000000000..7d85a0400e --- /dev/null +++ b/obsolete-buildroot/sources/openssh.patch @@ -0,0 +1,289 @@ +--- openssh-3.6.1p1/Makefile.in.orig 2003-03-20 17:34:34.000000000 -0700 ++++ openssh-3.6.1p1/Makefile.in 2003-04-25 17:09:00.000000000 -0600 +@@ -27,7 +27,7 @@ + RAND_HELPER=$(libexecdir)/ssh-rand-helper + PRIVSEP_PATH=@PRIVSEP_PATH@ + SSH_PRIVSEP_USER=@SSH_PRIVSEP_USER@ +-STRIP_OPT=@STRIP_OPT@ ++STRIP_OPT= + + PATHS= -DSSHDIR=\"$(sysconfdir)\" \ + -D_PATH_SSH_PROGRAM=\"$(SSH_PROGRAM)\" \ +--- openssh-3.8p1/configure.ac.orig 2004-02-23 22:47:04.000000000 -0700 ++++ openssh-3.8p1/configure.ac 2004-03-19 01:41:47.000000000 -0700 +@@ -481,6 +481,9 @@ + [ + AC_MSG_RESULT(no) + AC_MSG_ERROR([*** compiler cannot create working executables, check config.log ***]) ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) + ] + ) + +@@ -632,6 +635,9 @@ + else + AC_MSG_WARN([zlib version may have security problems]) + fi ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) + ] + ) + +@@ -696,6 +702,9 @@ + [ + AC_MSG_RESULT(no) + AC_DEFINE(BROKEN_ONE_BYTE_DIRENT_D_NAME) ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) + ] + ) + +@@ -727,6 +736,9 @@ + [ + AC_MSG_RESULT(no) + AC_MSG_ERROR([** Incomplete or missing s/key libraries.]) ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) + ]) + fi + ] +@@ -840,7 +852,11 @@ + ], + [AC_MSG_RESULT(yes)], + [AC_DEFINE(BROKEN_SETRESUID) +- AC_MSG_RESULT(not implemented)] ++ AC_MSG_RESULT(not implemented) ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) ++ ] + ) + ]) + +@@ -854,7 +870,11 @@ + ], + [AC_MSG_RESULT(yes)], + [AC_DEFINE(BROKEN_SETRESGID) +- AC_MSG_RESULT(not implemented)] ++ AC_MSG_RESULT(not implemented) ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) ++ ] + ) + ]) + +@@ -890,6 +910,9 @@ + AC_MSG_RESULT(no) + AC_DEFINE(BROKEN_SNPRINTF) + AC_MSG_WARN([****** Your snprintf() function is broken, complain to your vendor]) ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) + ] + ) + fi +@@ -963,7 +986,10 @@ + [ + AC_MSG_RESULT(no) + AC_DEFINE(SSHD_ACQUIRES_CTTY) +- ] ++ ], ++ [AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) ++ ] + ) + fi + +@@ -1096,6 +1122,10 @@ + [ + AC_MSG_RESULT(not found) + AC_MSG_ERROR(OpenSSL version header not found.) ++ ], ++ [ ++ ssl_header_ver="0x0090704fL (OpenSSL 0.9.7d 17 Mar 2004)" ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to $ssl_header_ver]) + ] + ) + +@@ -1129,6 +1159,10 @@ + [ + AC_MSG_RESULT(not found) + AC_MSG_ERROR(OpenSSL library not found.) ++ ], ++ [ ++ ssl_header_ver="0x0090704fL (OpenSSL 0.9.7d 17 Mar 2004)" ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to $ssl_library_ver]) + ] + ) + +@@ -1148,7 +1182,11 @@ + AC_MSG_ERROR([Your OpenSSL headers do not match your library. + Check config.log for details. + Also see contrib/findssl.sh for help identifying header/library mismatches.]) +- ] ++ ], ++ [ ++ AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) ++ ] + ) + + # Some systems want crypt() from libcrypt, *not* the version in OpenSSL, +@@ -1183,6 +1221,11 @@ + # Default to use of the rand helper if OpenSSL doesn't + # seed itself + USE_RAND_HELPER=yes ++ ], ++ [ ++ OPENSSL_SEEDS_ITSELF=yes ++ AC_MSG_RESULT(yes) ++ AC_MSG_WARN([Cannot run test when crosscompiling, defaulted to yes.]) + ] + ) + +@@ -1773,7 +1816,8 @@ + #else + main() { exit(0); } + #endif +- ], [ true ], [ AC_DEFINE(BROKEN_SNPRINTF) ] ++ ], [ true ], [ AC_DEFINE(BROKEN_SNPRINTF) ], ++ [ true ] + ) + fi + +@@ -1893,6 +1937,7 @@ + } + ], + [ ac_cv_have_accrights_in_msghdr="yes" ], ++ [ ac_cv_have_accrights_in_msghdr="no" ], + [ ac_cv_have_accrights_in_msghdr="no" ] + ) + ]) +@@ -1917,7 +1962,8 @@ + } + ], + [ ac_cv_have_control_in_msghdr="yes" ], +- [ ac_cv_have_control_in_msghdr="no" ] ++ [ ac_cv_have_control_in_msghdr="no" ], ++ [ ac_cv_have_control_in_msghdr="yes" ] + ) + ]) + if test "x$ac_cv_have_control_in_msghdr" = "xyes" ; then +@@ -2229,12 +2275,9 @@ + ) + fi + fi +-AC_CHECK_FILE("/dev/ptc", +- [ +- AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC) +- have_dev_ptc=1 +- ] +-) ++AC_MSG_CHECKING([for "/dev/ptc"]) ++AC_MSG_RESULT(no) ++have_dev_ptc=0 + + # Options from here on. Some of these are preset by platform above + AC_ARG_WITH(mantype, +@@ -2329,15 +2372,8 @@ + fi + + # check for /etc/default/login and use it if present. +-AC_ARG_ENABLE(etc-default-login, +- [ --disable-etc-default-login Disable using PATH from /etc/default/login [no]],, +-[ +-AC_CHECK_FILE("/etc/default/login", [ external_path_file=/etc/default/login ]) +- +-if test "x$external_path_file" = "x/etc/default/login"; then +- AC_DEFINE(HAVE_ETC_DEFAULT_LOGIN) +-fi +-]) ++AC_MSG_CHECKING([for "/etc/default/login"]) ++AC_MSG_RESULT(no) + + dnl BSD systems use /etc/login.conf so --with-default-path= has no effect + if test $ac_cv_func_login_getcapbool = "yes" -a \ +--- openssh-3.8p1.orig/sshd_config Fri Sep 27 05:21:58 2002 ++++ openssh-3.8p1/sshd_config Mon Mar 17 14:55:00 2003 +@@ -89,5 +89,8 @@ + #Banner /some/path + #VerifyReverseMapping no + ++ClientAliveInterval 15 ++ClientAliveCountMax 4 ++ + # override default of no subsystems +-Subsystem sftp /usr/libexec/sftp-server ++Subsystem sftp /usr/sbin/sftp-server +--- openssh-3.6.1p1/S50sshd Fri Sep 27 05:21:58 2002 ++++ openssh-3.6.1p1/S50sshd Mon Mar 17 14:55:00 2003 +@@ -0,0 +1,64 @@ ++#!/bin/sh ++# ++# sshd Starts sshd. ++# ++ ++# Make sure the ssh-keygen progam exists ++[ -f /usr/bin/ssh-keygen ] || exit 0 ++ ++# Check for the SSH1 RSA key ++if [ ! -f /etc/ssh_host_key ] ; then ++ echo Generating RSA Key... ++ /usr/bin/ssh-keygen -t rsa1 -f /etc/ssh_host_key -C '' -N '' ++fi ++ ++# Check for the SSH2 RSA key ++if [ ! -f /etc/ssh_host_rsa_key ] ; then ++ echo Generating RSA Key... ++ /usr/bin/ssh-keygen -t rsa -f /etc/ssh_host_rsa_key -C '' -N '' ++fi ++ ++# Check for the SSH2 DSA key ++if [ ! -f /etc/ssh_host_dsa_key ] ; then ++ echo Generating DSA Key... ++ echo THIS CAN TAKE A MINUTE OR TWO DEPENDING ON YOUR PROCESSOR! ++ echo ++ /usr/bin/ssh-keygen -t dsa -f /etc/ssh_host_dsa_key -C '' -N '' ++fi ++ ++umask 077 ++ ++start() { ++ echo -n "Starting sshd: " ++ /usr/sbin/sshd ++ touch /var/lock/sshd ++ echo "OK" ++} ++stop() { ++ echo -n "Stopping sshd: " ++ killall sshd ++ rm -f /var/lock/sshd ++ echo "OK" ++} ++restart() { ++ stop ++ start ++} ++ ++case "$1" in ++ start) ++ start ++ ;; ++ stop) ++ stop ++ ;; ++ restart|reload) ++ restart ++ ;; ++ *) ++ echo $"Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? ++ diff --git a/obsolete-buildroot/sources/openssl.patch b/obsolete-buildroot/sources/openssl.patch new file mode 100644 index 0000000000..2e8d50f1cb --- /dev/null +++ b/obsolete-buildroot/sources/openssl.patch @@ -0,0 +1,238 @@ +--- openssl-0.9.7.orig/Configure ++++ openssl-0.9.7/Configure +@@ -1,4 +1,4 @@ +-: ++#!/usr/bin/perl + eval 'exec perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + ## +@@ -373,6 +373,40 @@ + # assembler versions -- currently defunct: + ##"OpenBSD-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer:::(unknown):SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2:${alpha_asm}", + ++# Sane Linux configuration values, stolen from the Debian package.... ++"linux-alpha","gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-alpha-ev4","gcc:-DTERMIO -O3 -mcpu=ev4 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-alpha-ev5","gcc:-DTERMIO -O3 -mcpu=ev5 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-arm","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-freebsd-alpha","gcc:-DTERMIOS -O -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-freebsd-i386", "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall::-pthread -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-hppa","gcc:-DB_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-hurd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-ia64","gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR:asm/ia64.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++#"linux-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC", ++"linux-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-i386-i486","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i486 -mcpu=i486 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-i386-i586","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i586 -mcpu=i586 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-i386-i686/cmov","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i686 -mcpu=i686 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-m68k","gcc:-DB_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-mips", "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-mipsel", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-netbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-netbsd-m68k", "gcc:-DB_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-netbsd-sparc", "gcc:-DB_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -mv8 -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-openbsd-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-openbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-openbsd-mips","gcc:-O2 -DL_ENDIAN::(unknown)::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-powerpc","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_UNROLL DES_RISC2 DES_PTR MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-s390","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh3", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh4", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh3eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh4eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sparc","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sparc-v8","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v8 -fomit-frame-pointer -Wall -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sparc-v9","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v9 -Wa,-Av8plus -fomit-frame-pointer -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8plus.o:::asm/md5-sparcv8plus.o::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-cris", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fpic::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", + # The intel boxes :-), It would be worth seeing if bsdi-gcc can use the + # bn86-elf.o file file since it is hand tweaked assembler. + "linux-elf", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", +--- openssl-0.9.7.orig/crypto/md5/asm/md5-sparcv9.S ++++ openssl-0.9.7/crypto/md5/asm/md5-sparcv9.S +@@ -72,14 +72,14 @@ + #define Dval R8 + + #if defined(MD5_BLOCK_DATA_ORDER) +-# if defined(OPENSSL_SYSNAME_ULTRASPARC) ++/*# if defined(OPENSSL_SYSNAME_ULTRASPARC)*/ + # define LOAD lda + # define X(i) [%i1+i*4]%asi + # define md5_block md5_block_asm_data_order_aligned + # define ASI_PRIMARY_LITTLE 0x88 +-# else ++/*# else + # error "MD5_BLOCK_DATA_ORDER is supported only on UltraSPARC!" +-# endif ++# endif*/ + #else + # define LOAD ld + # define X(i) [%i1+i*4] +--- openssl-0.9.7.orig/crypto/opensslconf.h ++++ openssl-0.9.7/crypto/opensslconf.h +@@ -4,17 +4,38 @@ + /* OpenSSL was configured with the following options: */ + #ifndef OPENSSL_DOING_MAKEDEPEND + ++#ifndef OPENSSL_NO_IDEA ++# define OPENSSL_NO_IDEA ++#endif ++#ifndef OPENSSL_NO_MDC2 ++# define OPENSSL_NO_MDC2 ++#endif ++#ifndef OPENSSL_NO_RC5 ++# define OPENSSL_NO_RC5 ++#endif + #ifndef OPENSSL_NO_KRB5 + # define OPENSSL_NO_KRB5 + #endif + + #endif /* OPENSSL_DOING_MAKEDEPEND */ ++#ifndef OPENSSL_THREADS ++# define OPENSSL_THREADS ++#endif + + /* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ + #ifdef OPENSSL_ALGORITHM_DEFINES ++# if defined(OPENSSL_NO_IDEA) && !defined(NO_IDEA) ++# define NO_IDEA ++# endif ++# if defined(OPENSSL_NO_MDC2) && !defined(NO_MDC2) ++# define NO_MDC2 ++# endif ++# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) ++# define NO_RC5 ++# endif + # if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) + # define NO_KRB5 + # endif +@@ -27,7 +48,7 @@ + + #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ + #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +-#define OPENSSLDIR "/usr/local/ssl" ++#define OPENSSLDIR "/usr/lib/ssl" + #endif + #endif + +@@ -79,7 +100,7 @@ + + #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) + #define CONFIG_HEADER_BN_H +-#undef BN_LLONG ++#define BN_LLONG + + /* Should we define BN_DIV2W here? */ + +@@ -98,7 +119,7 @@ + #define CONFIG_HEADER_RC4_LOCL_H + /* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +-#undef RC4_INDEX ++#define RC4_INDEX + #endif + + #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +@@ -112,14 +133,14 @@ + /* the following is tweaked from a config script, that is why it is a + * protected undef/define */ + #ifndef DES_PTR +-#undef DES_PTR ++#define DES_PTR + #endif + + /* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ + #ifndef DES_RISC1 +-#undef DES_RISC1 ++#define DES_RISC1 + #endif + + #ifndef DES_RISC2 +@@ -133,7 +154,7 @@ + /* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ + #ifndef DES_UNROLL +-#undef DES_UNROLL ++#define DES_UNROLL + #endif + + /* These default values were supplied by +--- openssl-0.9.7.orig/ssl/ssl_algs.c ++++ openssl-0.9.7/ssl/ssl_algs.c +@@ -109,3 +109,8 @@ + return(1); + } + ++#undef SSLeay_add_ssl_algorithms ++int SSLeay_add_ssl_algorithms(void) ++ { ++ return SSL_library_init(); ++ } +--- openssl-0.9.7.orig/tools/c_rehash.in ++++ openssl-0.9.7/tools/c_rehash.in +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + + # Perl c_rehash script, scan all files in a directory +--- openssl-0.9.7.orig/util/clean-depend.pl ++++ openssl-0.9.7/util/clean-depend.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # Clean the dependency list in a makefile of standard includes... + # Written by Ben Laurie 19 Jan 1999 + +--- openssl-0.9.7.orig/util/extract-names.pl ++++ openssl-0.9.7/util/extract-names.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl ++#!/usr/bin/perl + + $/ = ""; # Eat a paragraph at once. + while() { +--- openssl-0.9.7.orig/util/mkdef.pl ++++ openssl-0.9.7/util/mkdef.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # + # generate a .def file + # +--- openssl-0.9.7.orig/util/mkerr.pl ++++ openssl-0.9.7/util/mkerr.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + my $config = "crypto/err/openssl.ec"; + my $debug = 0; +--- openssl-0.9.7.orig/util/mkstack.pl ++++ openssl-0.9.7/util/mkstack.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + # This is a utility that searches out "DECLARE_STACK_OF()" + # declarations in .h and .c files, and updates/creates/replaces +--- openssl-0.9.7.orig/util/pod2man.pl ++++ openssl-0.9.7/util/pod2man.pl +@@ -1,4 +1,4 @@ +-: #!/usr/bin/perl-5.005 ++#!/usr/bin/perl + eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + +--- openssl-0.9.7.orig/util/selftest.pl ++++ openssl-0.9.7/util/selftest.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # + # Run the test suite and generate a report + # diff --git a/obsolete-buildroot/sources/openvpn b/obsolete-buildroot/sources/openvpn new file mode 100755 index 0000000000..94bdc600e0 --- /dev/null +++ b/obsolete-buildroot/sources/openvpn @@ -0,0 +1,103 @@ +#!/bin/sh -e +# +# Original version by Robert Leslie +# , edited by iwj and cs +# Modified for openvpn by Alberto Gonzalez Iniesta +# Modified for restarting / starting / stopping single tunnels by Richard Mueller + +test $DEBIAN_SCRIPT_DEBUG && set -v -x + +DAEMON=/usr/sbin/openvpn +CONFIG_DIR=/etc/openvpn +test -x $DAEMON || exit 0 +test -d $CONFIG_DIR || exit 0 + +start_vpn () { + $DAEMON --daemon --writepid /var/run/openvpn.$NAME.pid \ + --config $CONFIG_DIR/$NAME.conf --cd $CONFIG_DIR || echo -n " FAILED->" + echo -n " $NAME" +} +stop_vpn () { + kill `cat $PIDFILE` || true + rm $PIDFILE +} + +case "$1" in +start) + echo -n "Starting openvpn:" + + if test -z $2 ; then + for CONFIG in `cd $CONFIG_DIR; ls *.conf 2> /dev/null`; do + NAME=${CONFIG%%.conf} + start_vpn + done + else + if test -e $CONFIG_DIR/$2.conf ; then + NAME=$2 + start_vpn + else + echo -n " No such VPN: $2" + fi + fi + echo "." + + ;; +stop) + echo -n "Stopping openvpn:" + + if test -z $2 ; then + for PIDFILE in `ls /var/run/openvpn.*.pid 2> /dev/null`; do + NAME=`echo $PIDFILE | cut -c18-` + NAME=${NAME%%.pid} + stop_vpn + echo -n " $NAME" + done + else + if test -e /var/run/openvpn.$2.pid ; then + PIDFILE=`ls /var/run/openvpn.$2.pid 2> /dev/null` + NAME=`echo $PIDFILE | cut -c18-` + NAME=${NAME%%.pid} + stop_vpn + echo -n " $NAME" + else + echo -n " No such VPN: $2" + fi + fi + echo "." + ;; +# We only 'reload' for running VPNs. New ones will only start with 'start' or 'restart'. +reload|force-reload) + echo -n "Reloading openvpn:" + for PIDFILE in `ls /var/run/openvpn.*.pid 2> /dev/null`; do + NAME=`echo $PIDFILE | cut -c18-` + NAME=${NAME%%.pid} +# If openvpn if running under a different user than root we'll need to restart + if egrep '^( |\t)*user' $CONFIG_DIR/$NAME.conf > /dev/null 2>&1 ; then + stop_vpn + sleep 1 + start_vpn + echo -n "(restarted)" + else + kill -HUP `cat $PIDFILE` || true +# start-stop-daemon --stop --signal HUP --quiet --oknodo \ +# --exec $DAEMON --pidfile $PIDFILE + echo -n " $NAME" + fi + done + echo "." + ;; + +restart) + $0 stop $2 + sleep 1 + $0 start $2 + ;; +*) + echo "Usage: $0 {start|stop|reload|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 + +# vim:set ai et sts=2 sw=2 tw=0: diff --git a/obsolete-buildroot/sources/openwrt-diag.c b/obsolete-buildroot/sources/openwrt-diag.c new file mode 100644 index 0000000000..73bdac918e --- /dev/null +++ b/obsolete-buildroot/sources/openwrt-diag.c @@ -0,0 +1,137 @@ +// replacement diag module +// (c) 2004 openwrt +// mbm at alt dot org +// +// initial release 2004/03/28 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void *sbh; + +// v2.x - - - - - +#define DIAG_GPIO (1<<1) +#define DMZ_GPIO (1<<7) + +static void set_gpio(uint32 mask, uint32 value) { + sb_gpiocontrol(sbh,mask,0); + sb_gpioouten(sbh,mask,mask); + sb_gpioout(sbh,mask,value); +} + +static void v2_set_diag(u8 state) { + set_gpio(DIAG_GPIO,state); +} +static void v2_set_dmz(u8 state) { + set_gpio(DMZ_GPIO,state); +} + +// v1.x - - - - - +#define LED_DIAG 0x13 +#define LED_DMZ 0x12 + +static void v1_set_diag(u8 state) { + if (!state) { + *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DIAG)=0xFF; + } else { + *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DIAG); + } +} +static void v1_set_dmz(u8 state) { + if (!state) { + *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DMZ)=0xFF; + } else { + *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DMZ); + } +} + +// - - - - - +#define BIT_DMZ 0x01 +#define BIT_DIAG 0x04 + +void (*set_diag)(u8 state); +void (*set_dmz)(u8 state); + +static unsigned int diag = 0; +static struct timer_list timer; + +static void diag_change() +{ + printk(KERN_INFO "led -> %02x\n",diag); + + set_diag(0xFF); // off + set_dmz(0xFF); // off + + if(diag & BIT_DIAG) + set_diag(0x00); // on + if(diag & BIT_DMZ) + set_dmz(0x00); // on +} + +static int proc_diag(ctl_table *table, int write, struct file *filp, + void *buffer, size_t *lenp) +{ + int r; + r = proc_dointvec(table, write, filp, buffer, lenp); + if (write && !r) { + diag_change(); + } + return r; +} + +// - - - - - +static struct ctl_table_header *diag_sysctl_header; + +static ctl_table sys_diag[] = { + { + ctl_name: 2000, + procname: "diag", + data: &diag, + maxlen: sizeof(diag), + mode: 0644, + proc_handler: proc_diag + }, + { 0 } +}; + +static int __init diag_init() +{ + u32 board_type; + sbh = sb_kattach(); + sb_gpiosetcore(sbh); + + board_type = sb_boardtype(sbh); + printk(KERN_INFO "diag board_type: %08x\n",board_type); + + if (board_type & 0x400) { + board_type=1; + set_diag=v1_set_diag; + set_dmz=v1_set_dmz; + } else { + board_type=2; + set_diag=v2_set_diag; + set_dmz=v2_set_dmz; + } + printk(KERN_INFO "using v%d hardware\n",board_type); + + diag_sysctl_header = register_sysctl_table(sys_diag, 0); + diag_change(); + + return 0; +} + +static void __exit diag_exit() +{ + unregister_sysctl_table(diag_sysctl_header); + del_timer(&timer); +} + +module_init(diag_init); +module_exit(diag_exit); diff --git a/obsolete-buildroot/sources/openwrt-linux-netfilter.patch b/obsolete-buildroot/sources/openwrt-linux-netfilter.patch new file mode 100644 index 0000000000..4d8b0a1f62 --- /dev/null +++ b/obsolete-buildroot/sources/openwrt-linux-netfilter.patch @@ -0,0 +1,5823 @@ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack.h 2003-08-12 07:43:11.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack.h 2004-05-09 04:13:03.000000000 -0400 +@@ -45,39 +45,27 @@ + + #include + #include +-#include + + /* per conntrack: protocol private data */ + union ip_conntrack_proto { + /* insert conntrack proto private data here */ +- struct ip_ct_gre gre; + struct ip_ct_tcp tcp; + struct ip_ct_icmp icmp; + }; + + union ip_conntrack_expect_proto { + /* insert expect proto private data here */ +- struct ip_ct_gre_expect gre; + }; + + /* Add protocol helper include file here */ +-#include +-#include +-#include +- + #include + #include +-#include + + /* per expectation: application helper private data */ + union ip_conntrack_expect_help { + /* insert conntrack helper private data (expect) here */ +- struct ip_ct_pptp_expect exp_pptp_info; +- struct ip_ct_mms_expect exp_mms_info; +- struct ip_ct_h225_expect exp_h225_info; + struct ip_ct_ftp_expect exp_ftp_info; + struct ip_ct_irc_expect exp_irc_info; +- struct ip_autofw_expect exp_autofw_info; + + #ifdef CONFIG_IP_NF_NAT_NEEDED + union { +@@ -89,21 +77,16 @@ + /* per conntrack: application helper private data */ + union ip_conntrack_help { + /* insert conntrack helper private data (master) here */ +- struct ip_ct_pptp_master ct_pptp_info; +- struct ip_ct_mms_master ct_mms_info; +- struct ip_ct_h225_master ct_h225_info; + struct ip_ct_ftp_master ct_ftp_info; + struct ip_ct_irc_master ct_irc_info; + }; + + #ifdef CONFIG_IP_NF_NAT_NEEDED + #include +-#include + + /* per conntrack: nat application helper private data */ + union ip_conntrack_nat_help { + /* insert nat helper private data here */ +- struct ip_nat_pptp nat_pptp_info; + }; + #endif + +@@ -275,9 +258,5 @@ + } + + extern unsigned int ip_conntrack_htable_size; +- +-/* connection tracking time out variables. */ +-extern int sysctl_ip_conntrack_tcp_timeouts[10]; +-extern int sysctl_ip_conntrack_udp_timeouts[2]; + #endif /* __KERNEL__ */ + #endif /* _IP_CONNTRACK_H */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_h323.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_h323.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_h323.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_h323.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,30 +0,0 @@ +-#ifndef _IP_CONNTRACK_H323_H +-#define _IP_CONNTRACK_H323_H +-/* H.323 connection tracking. */ +- +-#ifdef __KERNEL__ +-/* Protects H.323 related data */ +-DECLARE_LOCK_EXTERN(ip_h323_lock); +-#endif +- +-/* Default H.225 port */ +-#define H225_PORT 1720 +- +-/* This structure is per expected connection */ +-struct ip_ct_h225_expect { +- u_int16_t port; /* Port of the H.225 helper/RTCP/RTP channel */ +- enum ip_conntrack_dir dir; /* Direction of the original connection */ +- unsigned int offset; /* offset of the address in the payload */ +-}; +- +-/* This structure exists only once per master */ +-struct ip_ct_h225_master { +- int is_h225; /* H.225 or H.245 connection */ +-#ifdef CONFIG_IP_NF_NAT_NEEDED +- enum ip_conntrack_dir dir; /* Direction of the original connection */ +- u_int32_t seq[IP_CT_DIR_MAX]; /* Exceptional packet mangling for signal addressess... */ +- unsigned int offset[IP_CT_DIR_MAX]; /* ...and the offset of the addresses in the payload */ +-#endif +-}; +- +-#endif /* _IP_CONNTRACK_H323_H */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_mms.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_mms.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_mms.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_mms.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,31 +0,0 @@ +-#ifndef _IP_CONNTRACK_MMS_H +-#define _IP_CONNTRACK_MMS_H +-/* MMS tracking. */ +- +-#ifdef __KERNEL__ +-#include +- +-DECLARE_LOCK_EXTERN(ip_mms_lock); +- +-#define MMS_PORT 1755 +-#define MMS_SRV_MSG_ID 196610 +- +-#define MMS_SRV_MSG_OFFSET 36 +-#define MMS_SRV_UNICODE_STRING_OFFSET 60 +-#define MMS_SRV_CHUNKLENLV_OFFSET 16 +-#define MMS_SRV_CHUNKLENLM_OFFSET 32 +-#define MMS_SRV_MESSAGELENGTH_OFFSET 8 +-#endif +- +-/* This structure is per expected connection */ +-struct ip_ct_mms_expect { +- u_int32_t len; +- u_int32_t padding; +- u_int16_t port; +-}; +- +-/* This structure exists only once per master */ +-struct ip_ct_mms_master { +-}; +- +-#endif /* _IP_CONNTRACK_MMS_H */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_pptp.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_pptp.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_pptp.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_pptp.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,313 +0,0 @@ +-/* PPTP constants and structs */ +-#ifndef _CONNTRACK_PPTP_H +-#define _CONNTRACK_PPTP_H +- +-/* state of the control session */ +-enum pptp_ctrlsess_state { +- PPTP_SESSION_NONE, /* no session present */ +- PPTP_SESSION_ERROR, /* some session error */ +- PPTP_SESSION_STOPREQ, /* stop_sess request seen */ +- PPTP_SESSION_REQUESTED, /* start_sess request seen */ +- PPTP_SESSION_CONFIRMED, /* session established */ +-}; +- +-/* state of the call inside the control session */ +-enum pptp_ctrlcall_state { +- PPTP_CALL_NONE, +- PPTP_CALL_ERROR, +- PPTP_CALL_OUT_REQ, +- PPTP_CALL_OUT_CONF, +- PPTP_CALL_IN_REQ, +- PPTP_CALL_IN_REP, +- PPTP_CALL_IN_CONF, +- PPTP_CALL_CLEAR_REQ, +-}; +- +- +-/* conntrack private data */ +-struct ip_ct_pptp_master { +- enum pptp_ctrlsess_state sstate; /* session state */ +- +- /* everything below is going to be per-expectation in newnat, +- * since there could be more than one call within one session */ +- enum pptp_ctrlcall_state cstate; /* call state */ +- u_int16_t pac_call_id; /* call id of PAC, host byte order */ +- u_int16_t pns_call_id; /* call id of PNS, host byte order */ +-}; +- +-/* conntrack_expect private member */ +-struct ip_ct_pptp_expect { +- enum pptp_ctrlcall_state cstate; /* call state */ +- u_int16_t pac_call_id; /* call id of PAC */ +- u_int16_t pns_call_id; /* call id of PNS */ +-}; +- +- +-#ifdef __KERNEL__ +- +-#include +-DECLARE_LOCK_EXTERN(ip_pptp_lock); +- +-#define IP_CONNTR_PPTP PPTP_CONTROL_PORT +- +-union pptp_ctrl_union { +- void *rawreq; +- struct PptpStartSessionRequest *sreq; +- struct PptpStartSessionReply *srep; +- struct PptpStopSessionReqest *streq; +- struct PptpStopSessionReply *strep; +- struct PptpOutCallRequest *ocreq; +- struct PptpOutCallReply *ocack; +- struct PptpInCallRequest *icreq; +- struct PptpInCallReply *icack; +- struct PptpInCallConnected *iccon; +- struct PptpClearCallRequest *clrreq; +- struct PptpCallDisconnectNotify *disc; +- struct PptpWanErrorNotify *wanerr; +- struct PptpSetLinkInfo *setlink; +-}; +- +- +- +-#define PPTP_CONTROL_PORT 1723 +- +-#define PPTP_PACKET_CONTROL 1 +-#define PPTP_PACKET_MGMT 2 +- +-#define PPTP_MAGIC_COOKIE 0x1a2b3c4d +- +-struct pptp_pkt_hdr { +- __u16 packetLength; +- __u16 packetType; +- __u32 magicCookie; +-}; +- +-/* PptpControlMessageType values */ +-#define PPTP_START_SESSION_REQUEST 1 +-#define PPTP_START_SESSION_REPLY 2 +-#define PPTP_STOP_SESSION_REQUEST 3 +-#define PPTP_STOP_SESSION_REPLY 4 +-#define PPTP_ECHO_REQUEST 5 +-#define PPTP_ECHO_REPLY 6 +-#define PPTP_OUT_CALL_REQUEST 7 +-#define PPTP_OUT_CALL_REPLY 8 +-#define PPTP_IN_CALL_REQUEST 9 +-#define PPTP_IN_CALL_REPLY 10 +-#define PPTP_IN_CALL_CONNECT 11 +-#define PPTP_CALL_CLEAR_REQUEST 12 +-#define PPTP_CALL_DISCONNECT_NOTIFY 13 +-#define PPTP_WAN_ERROR_NOTIFY 14 +-#define PPTP_SET_LINK_INFO 15 +- +-#define PPTP_MSG_MAX 15 +- +-/* PptpGeneralError values */ +-#define PPTP_ERROR_CODE_NONE 0 +-#define PPTP_NOT_CONNECTED 1 +-#define PPTP_BAD_FORMAT 2 +-#define PPTP_BAD_VALUE 3 +-#define PPTP_NO_RESOURCE 4 +-#define PPTP_BAD_CALLID 5 +-#define PPTP_REMOVE_DEVICE_ERROR 6 +- +-struct PptpControlHeader { +- __u16 messageType; +- __u16 reserved; +-}; +- +-/* FramingCapability Bitmap Values */ +-#define PPTP_FRAME_CAP_ASYNC 0x1 +-#define PPTP_FRAME_CAP_SYNC 0x2 +- +-/* BearerCapability Bitmap Values */ +-#define PPTP_BEARER_CAP_ANALOG 0x1 +-#define PPTP_BEARER_CAP_DIGITAL 0x2 +- +-struct PptpStartSessionRequest { +- __u16 protocolVersion; +- __u8 reserved1; +- __u8 reserved2; +- __u32 framingCapability; +- __u32 bearerCapability; +- __u16 maxChannels; +- __u16 firmwareRevision; +- __u8 hostName[64]; +- __u8 vendorString[64]; +-}; +- +-/* PptpStartSessionResultCode Values */ +-#define PPTP_START_OK 1 +-#define PPTP_START_GENERAL_ERROR 2 +-#define PPTP_START_ALREADY_CONNECTED 3 +-#define PPTP_START_NOT_AUTHORIZED 4 +-#define PPTP_START_UNKNOWN_PROTOCOL 5 +- +-struct PptpStartSessionReply { +- __u16 protocolVersion; +- __u8 resultCode; +- __u8 generalErrorCode; +- __u32 framingCapability; +- __u32 bearerCapability; +- __u16 maxChannels; +- __u16 firmwareRevision; +- __u8 hostName[64]; +- __u8 vendorString[64]; +-}; +- +-/* PptpStopReasons */ +-#define PPTP_STOP_NONE 1 +-#define PPTP_STOP_PROTOCOL 2 +-#define PPTP_STOP_LOCAL_SHUTDOWN 3 +- +-struct PptpStopSessionRequest { +- __u8 reason; +-}; +- +-/* PptpStopSessionResultCode */ +-#define PPTP_STOP_OK 1 +-#define PPTP_STOP_GENERAL_ERROR 2 +- +-struct PptpStopSessionReply { +- __u8 resultCode; +- __u8 generalErrorCode; +-}; +- +-struct PptpEchoRequest { +- __u32 identNumber; +-}; +- +-/* PptpEchoReplyResultCode */ +-#define PPTP_ECHO_OK 1 +-#define PPTP_ECHO_GENERAL_ERROR 2 +- +-struct PptpEchoReply { +- __u32 identNumber; +- __u8 resultCode; +- __u8 generalErrorCode; +- __u16 reserved; +-}; +- +-/* PptpFramingType */ +-#define PPTP_ASYNC_FRAMING 1 +-#define PPTP_SYNC_FRAMING 2 +-#define PPTP_DONT_CARE_FRAMING 3 +- +-/* PptpCallBearerType */ +-#define PPTP_ANALOG_TYPE 1 +-#define PPTP_DIGITAL_TYPE 2 +-#define PPTP_DONT_CARE_BEARER_TYPE 3 +- +-struct PptpOutCallRequest { +- __u16 callID; +- __u16 callSerialNumber; +- __u32 minBPS; +- __u32 maxBPS; +- __u32 bearerType; +- __u32 framingType; +- __u16 packetWindow; +- __u16 packetProcDelay; +- __u16 reserved1; +- __u16 phoneNumberLength; +- __u16 reserved2; +- __u8 phoneNumber[64]; +- __u8 subAddress[64]; +-}; +- +-/* PptpCallResultCode */ +-#define PPTP_OUTCALL_CONNECT 1 +-#define PPTP_OUTCALL_GENERAL_ERROR 2 +-#define PPTP_OUTCALL_NO_CARRIER 3 +-#define PPTP_OUTCALL_BUSY 4 +-#define PPTP_OUTCALL_NO_DIAL_TONE 5 +-#define PPTP_OUTCALL_TIMEOUT 6 +-#define PPTP_OUTCALL_DONT_ACCEPT 7 +- +-struct PptpOutCallReply { +- __u16 callID; +- __u16 peersCallID; +- __u8 resultCode; +- __u8 generalErrorCode; +- __u16 causeCode; +- __u32 connectSpeed; +- __u16 packetWindow; +- __u16 packetProcDelay; +- __u32 physChannelID; +-}; +- +-struct PptpInCallRequest { +- __u16 callID; +- __u16 callSerialNumber; +- __u32 callBearerType; +- __u32 physChannelID; +- __u16 dialedNumberLength; +- __u16 dialingNumberLength; +- __u8 dialedNumber[64]; +- __u8 dialingNumber[64]; +- __u8 subAddress[64]; +-}; +- +-/* PptpInCallResultCode */ +-#define PPTP_INCALL_ACCEPT 1 +-#define PPTP_INCALL_GENERAL_ERROR 2 +-#define PPTP_INCALL_DONT_ACCEPT 3 +- +-struct PptpInCallReply { +- __u16 callID; +- __u16 peersCallID; +- __u8 resultCode; +- __u8 generalErrorCode; +- __u16 packetWindow; +- __u16 packetProcDelay; +- __u16 reserved; +-}; +- +-struct PptpInCallConnected { +- __u16 peersCallID; +- __u16 reserved; +- __u32 connectSpeed; +- __u16 packetWindow; +- __u16 packetProcDelay; +- __u32 callFramingType; +-}; +- +-struct PptpClearCallRequest { +- __u16 callID; +- __u16 reserved; +-}; +- +-struct PptpCallDisconnectNotify { +- __u16 callID; +- __u8 resultCode; +- __u8 generalErrorCode; +- __u16 causeCode; +- __u16 reserved; +- __u8 callStatistics[128]; +-}; +- +-struct PptpWanErrorNotify { +- __u16 peersCallID; +- __u16 reserved; +- __u32 crcErrors; +- __u32 framingErrors; +- __u32 hardwareOverRuns; +- __u32 bufferOverRuns; +- __u32 timeoutErrors; +- __u32 alignmentErrors; +-}; +- +-struct PptpSetLinkInfo { +- __u16 peersCallID; +- __u16 reserved; +- __u32 sendAccm; +- __u32 recvAccm; +-}; +- +- +-struct pptp_priv_data { +- __u16 call_id; +- __u16 mcall_id; +- __u16 pcall_id; +-}; +- +-#endif /* __KERNEL__ */ +-#endif /* _CONNTRACK_PPTP_H */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,121 +0,0 @@ +-#ifndef _CONNTRACK_PROTO_GRE_H +-#define _CONNTRACK_PROTO_GRE_H +-#include +- +-/* GRE PROTOCOL HEADER */ +- +-/* GRE Version field */ +-#define GRE_VERSION_1701 0x0 +-#define GRE_VERSION_PPTP 0x1 +- +-/* GRE Protocol field */ +-#define GRE_PROTOCOL_PPTP 0x880B +- +-/* GRE Flags */ +-#define GRE_FLAG_C 0x80 +-#define GRE_FLAG_R 0x40 +-#define GRE_FLAG_K 0x20 +-#define GRE_FLAG_S 0x10 +-#define GRE_FLAG_A 0x80 +- +-#define GRE_IS_C(f) ((f)&GRE_FLAG_C) +-#define GRE_IS_R(f) ((f)&GRE_FLAG_R) +-#define GRE_IS_K(f) ((f)&GRE_FLAG_K) +-#define GRE_IS_S(f) ((f)&GRE_FLAG_S) +-#define GRE_IS_A(f) ((f)&GRE_FLAG_A) +- +-/* GRE is a mess: Four different standards */ +-struct gre_hdr { +-#if defined(__LITTLE_ENDIAN_BITFIELD) +- __u16 rec:3, +- srr:1, +- seq:1, +- key:1, +- routing:1, +- csum:1, +- version:3, +- reserved:4, +- ack:1; +-#elif defined(__BIG_ENDIAN_BITFIELD) +- __u16 csum:1, +- routing:1, +- key:1, +- seq:1, +- srr:1, +- rec:3, +- ack:1, +- reserved:4, +- version:3; +-#else +-#error "Adjust your defines" +-#endif +- __u16 protocol; +-}; +- +-/* modified GRE header for PPTP */ +-struct gre_hdr_pptp { +- __u8 flags; /* bitfield */ +- __u8 version; /* should be GRE_VERSION_PPTP */ +- __u16 protocol; /* should be GRE_PROTOCOL_PPTP */ +- __u16 payload_len; /* size of ppp payload, not inc. gre header */ +- __u16 call_id; /* peer's call_id for this session */ +- __u32 seq; /* sequence number. Present if S==1 */ +- __u32 ack; /* seq number of highest packet recieved by */ +- /* sender in this session */ +-}; +- +- +-/* this is part of ip_conntrack */ +-struct ip_ct_gre { +- unsigned int stream_timeout; +- unsigned int timeout; +-}; +- +-/* this is part of ip_conntrack_expect */ +-struct ip_ct_gre_expect { +- struct ip_ct_gre_keymap *keymap_orig, *keymap_reply; +-}; +- +-#ifdef __KERNEL__ +- +-/* structure for original <-> reply keymap */ +-struct ip_ct_gre_keymap { +- struct list_head list; +- +- struct ip_conntrack_tuple tuple; +- struct ip_conntrack_expect *master; +-}; +- +- +-/* add new tuple->key_reply pair to keymap */ +-int ip_ct_gre_keymap_add(struct ip_conntrack_expect *exp, +- struct ip_conntrack_tuple *t, +- int reply); +- +-/* change an existing keymap entry */ +-void ip_ct_gre_keymap_change(struct ip_ct_gre_keymap *km, +- struct ip_conntrack_tuple *t); +- +- +- +-/* get pointer to gre key, if present */ +-static inline u_int32_t *gre_key(struct gre_hdr *greh) +-{ +- if (!greh->key) +- return NULL; +- if (greh->csum || greh->routing) +- return (u_int32_t *) (greh+sizeof(*greh)+4); +- return (u_int32_t *) (greh+sizeof(*greh)); +-} +- +-/* get pointer ot gre csum, if present */ +-static inline u_int16_t *gre_csum(struct gre_hdr *greh) +-{ +- if (!greh->csum) +- return NULL; +- return (u_int16_t *) (greh+sizeof(*greh)); +-} +- +-#endif /* __KERNEL__ */ +- +-#endif /* _CONNTRACK_PROTO_GRE_H */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_tftp.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_tftp.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_tftp.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_tftp.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,13 +0,0 @@ +-#ifndef _IP_CT_TFTP +-#define _IP_CT_TFTP +- +-#define TFTP_PORT 69 +- +-struct tftphdr { +- u_int16_t opcode; +-}; +- +-#define TFTP_OPCODE_READ 1 +-#define TFTP_OPCODE_WRITE 2 +- +-#endif /* _IP_CT_TFTP */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_tuple.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_tuple.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_conntrack_tuple.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_conntrack_tuple.h 2004-05-09 04:13:03.000000000 -0400 +@@ -14,7 +14,7 @@ + union ip_conntrack_manip_proto + { + /* Add other protocols here. */ +- u_int32_t all; ++ u_int16_t all; + + struct { + u_int16_t port; +@@ -25,9 +25,6 @@ + struct { + u_int16_t id; + } icmp; +- struct { +- u_int32_t key; +- } gre; + }; + + /* The manipulable part of the tuple. */ +@@ -47,7 +44,7 @@ + u_int32_t ip; + union { + /* Add other protocols here. */ +- u_int64_t all; ++ u_int16_t all; + + struct { + u_int16_t port; +@@ -58,11 +55,6 @@ + struct { + u_int8_t type, code; + } icmp; +- struct { +- u_int16_t protocol; +- u_int8_t version; +- u_int32_t key; +- } gre; + } u; + + /* The protocol. */ +@@ -80,16 +72,10 @@ + #ifdef __KERNEL__ + + #define DUMP_TUPLE(tp) \ +-DEBUGP("tuple %p: %u %u.%u.%u.%u:%u -> %u.%u.%u.%u:%u\n", \ ++DEBUGP("tuple %p: %u %u.%u.%u.%u:%hu -> %u.%u.%u.%u:%hu\n", \ + (tp), (tp)->dst.protonum, \ +- NIPQUAD((tp)->src.ip), ntohl((tp)->src.u.all), \ +- NIPQUAD((tp)->dst.ip), ntohl((tp)->dst.u.all)) +- +-#define DUMP_TUPLE_RAW(x) \ +- DEBUGP("tuple %p: %u %u.%u.%u.%u:0x%08x -> %u.%u.%u.%u:0x%08x\n",\ +- (x), (x)->dst.protonum, \ +- NIPQUAD((x)->src.ip), ntohl((x)->src.u.all), \ +- NIPQUAD((x)->dst.ip), ntohl((x)->dst.u.all)) ++ NIPQUAD((tp)->src.ip), ntohs((tp)->src.u.all), \ ++ NIPQUAD((tp)->dst.ip), ntohs((tp)->dst.u.all)) + + #define CTINFO2DIR(ctinfo) ((ctinfo) >= IP_CT_IS_REPLY ? IP_CT_DIR_REPLY : IP_CT_DIR_ORIGINAL) + +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_nat_pptp.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_nat_pptp.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_nat_pptp.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_nat_pptp.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,11 +0,0 @@ +-/* PPTP constants and structs */ +-#ifndef _NAT_PPTP_H +-#define _NAT_PPTP_H +- +-/* conntrack private data */ +-struct ip_nat_pptp { +- u_int16_t pns_call_id; /* NAT'ed PNS call id */ +- u_int16_t pac_call_id; /* NAT'ed PAC call id */ +-}; +- +-#endif /* _NAT_PPTP_H */ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ip_pool.h src/linux/linux.stock/include/linux/netfilter_ipv4/ip_pool.h +--- src/linux/linux/include/linux/netfilter_ipv4/ip_pool.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ip_pool.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,64 +0,0 @@ +-#ifndef _IP_POOL_H +-#define _IP_POOL_H +- +-/***************************************************************************/ +-/* 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*/ +-/***************************************************************************/ +- +-/* A sockopt of such quality has hardly ever been seen before on the open +- * market! This little beauty, hardly ever used: above 64, so it's +- * traditionally used for firewalling, not touched (even once!) by the +- * 2.0, 2.2 and 2.4 kernels! +- * +- * Comes with its own certificate of authenticity, valid anywhere in the +- * Free world! +- * +- * Rusty, 19.4.2000 +- */ +-#define SO_IP_POOL 81 +- +-typedef int ip_pool_t; /* pool index */ +-#define IP_POOL_NONE ((ip_pool_t)-1) +- +-struct ip_pool_request { +- int op; +- ip_pool_t index; +- u_int32_t addr; +- u_int32_t addr2; +-}; +- +-/* NOTE: I deliberately break the first cut ippool utility. Nobody uses it. */ +- +-#define IP_POOL_BAD001 0x00000010 +- +-#define IP_POOL_FLUSH 0x00000011 /* req.index, no arguments */ +-#define IP_POOL_INIT 0x00000012 /* from addr to addr2 incl. */ +-#define IP_POOL_DESTROY 0x00000013 /* req.index, no arguments */ +-#define IP_POOL_ADD_ADDR 0x00000014 /* add addr to pool */ +-#define IP_POOL_DEL_ADDR 0x00000015 /* del addr from pool */ +-#define IP_POOL_HIGH_NR 0x00000016 /* result in req.index */ +-#define IP_POOL_LOOKUP 0x00000017 /* result in addr and addr2 */ +-#define IP_POOL_USAGE 0x00000018 /* result in addr */ +-#define IP_POOL_TEST_ADDR 0x00000019 /* result (0/1) returned */ +- +-#ifdef __KERNEL__ +- +-/* NOTE: ip_pool_match() and ip_pool_mod() expect ADDR to be host byte order */ +-extern int ip_pool_match(ip_pool_t pool, u_int32_t addr); +-extern int ip_pool_mod(ip_pool_t pool, u_int32_t addr, int isdel); +- +-#endif +- +-#endif /*_IP_POOL_H*/ +diff -Nurb src/linux/linux/include/linux/netfilter_ipv4/ipt_pool.h src/linux/linux.stock/include/linux/netfilter_ipv4/ipt_pool.h +--- src/linux/linux/include/linux/netfilter_ipv4/ipt_pool.h 2003-07-04 04:12:27.000000000 -0400 ++++ src/linux/linux.stock/include/linux/netfilter_ipv4/ipt_pool.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,25 +0,0 @@ +-#ifndef _IPT_POOL_H +-#define _IPT_POOL_H +- +-#include +- +-#define IPT_POOL_INV_SRC 0x00000001 +-#define IPT_POOL_INV_DST 0x00000002 +-#define IPT_POOL_DEL_SRC 0x00000004 +-#define IPT_POOL_DEL_DST 0x00000008 +-#define IPT_POOL_INV_MOD_SRC 0x00000010 +-#define IPT_POOL_INV_MOD_DST 0x00000020 +-#define IPT_POOL_MOD_SRC_ACCEPT 0x00000040 +-#define IPT_POOL_MOD_DST_ACCEPT 0x00000080 +-#define IPT_POOL_MOD_SRC_DROP 0x00000100 +-#define IPT_POOL_MOD_DST_DROP 0x00000200 +- +-/* match info */ +-struct ipt_pool_info +-{ +- ip_pool_t src; +- ip_pool_t dst; +- unsigned flags; +-}; +- +-#endif /*_IPT_POOL_H*/ +diff -Nurb src/linux/linux/net/ipv4/netfilter/Config.in src/linux/linux.stock/net/ipv4/netfilter/Config.in +--- src/linux/linux/net/ipv4/netfilter/Config.in 2004-02-19 06:04:35.000000000 -0500 ++++ src/linux/linux.stock/net/ipv4/netfilter/Config.in 2004-05-09 04:13:03.000000000 -0400 +@@ -7,12 +7,7 @@ + tristate 'Connection tracking (required for masq/NAT)' CONFIG_IP_NF_CONNTRACK + if [ "$CONFIG_IP_NF_CONNTRACK" != "n" ]; then + dep_tristate ' FTP protocol support' CONFIG_IP_NF_FTP $CONFIG_IP_NF_CONNTRACK +- dep_tristate ' TFTP protocol support' CONFIG_IP_NF_TFTP $CONFIG_IP_NF_CONNTRACK +- dep_tristate ' H.323 (netmeeting) support' CONFIG_IP_NF_H323 $CONFIG_IP_NF_CONNTRACK + dep_tristate ' IRC protocol support' CONFIG_IP_NF_IRC $CONFIG_IP_NF_CONNTRACK +- dep_tristate ' MMS protocol support' CONFIG_IP_NF_MMS $CONFIG_IP_NF_CONNTRACK +- dep_tristate ' GRE protocol support' CONFIG_IP_NF_CT_PROTO_GRE $CONFIG_IP_NF_CONNTRACK +- dep_tristate ' PPTP protocol support' CONFIG_IP_NF_PPTP $CONFIG_IP_NF_CT_PROTO_GRE + fi + + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then +@@ -22,19 +17,11 @@ + if [ "$CONFIG_IP_NF_IPTABLES" != "n" ]; then + # The simple matches. + dep_tristate ' limit match support' CONFIG_IP_NF_MATCH_LIMIT $CONFIG_IP_NF_IPTABLES +- +- dep_tristate ' IP address pool support' CONFIG_IP_NF_POOL $CONFIG_IP_NF_IPTABLES +- if [ "$CONFIG_IP_NF_POOL" = "y" -o "$CONFIG_IP_NF_POOL" = "m" ]; then +- bool ' enable statistics on pool usage' CONFIG_IP_POOL_STATISTICS n +- fi +- + dep_tristate ' MAC address match support' CONFIG_IP_NF_MATCH_MAC $CONFIG_IP_NF_IPTABLES + dep_tristate ' Packet type match support' CONFIG_IP_NF_MATCH_PKTTYPE $CONFIG_IP_NF_IPTABLES + dep_tristate ' netfilter MARK match support' CONFIG_IP_NF_MATCH_MARK $CONFIG_IP_NF_IPTABLES + dep_tristate ' Multiple port match support' CONFIG_IP_NF_MATCH_MULTIPORT $CONFIG_IP_NF_IPTABLES +- dep_tristate ' Multiple port with ranges match support' CONFIG_IP_NF_MATCH_MPORT $CONFIG_IP_NF_IPTABLES + dep_tristate ' TOS match support' CONFIG_IP_NF_MATCH_TOS $CONFIG_IP_NF_IPTABLES +- dep_tristate ' TIME match support (EXPERIMENTAL)' CONFIG_IP_NF_MATCH_TIME $CONFIG_IP_NF_IPTABLES + dep_tristate ' ECN match support' CONFIG_IP_NF_MATCH_ECN $CONFIG_IP_NF_IPTABLES + + dep_tristate ' DSCP match support' CONFIG_IP_NF_MATCH_DSCP $CONFIG_IP_NF_IPTABLES +@@ -52,7 +39,6 @@ + fi + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + dep_tristate ' Unclean match support (EXPERIMENTAL)' CONFIG_IP_NF_MATCH_UNCLEAN $CONFIG_IP_NF_IPTABLES +- dep_tristate ' Webstr match support (EXPERIMENTAL)' CONFIG_IP_NF_MATCH_WEBSTR $CONFIG_IP_NF_IPTABLES + dep_tristate ' Owner match support (EXPERIMENTAL)' CONFIG_IP_NF_MATCH_OWNER $CONFIG_IP_NF_IPTABLES + fi + # The targets +@@ -70,29 +56,6 @@ + define_bool CONFIG_IP_NF_NAT_NEEDED y + dep_tristate ' MASQUERADE target support' CONFIG_IP_NF_TARGET_MASQUERADE $CONFIG_IP_NF_NAT + dep_tristate ' REDIRECT target support' CONFIG_IP_NF_TARGET_REDIRECT $CONFIG_IP_NF_NAT +- dep_tristate ' Automatic port forwarding (autofw) target support' CONFIG_IP_NF_AUTOFW $CONFIG_IP_NF_NAT +- dep_tristate ' TRIGGER target support (port-trigger)' CONFIG_IP_NF_TARGET_TRIGGER $CONFIG_IP_NF_NAT +- if [ "$CONFIG_IP_NF_H323" = "m" ]; then +- define_tristate CONFIG_IP_NF_NAT_H323 m +- else +- if [ "$CONFIG_IP_NF_H323" = "y" ]; then +- define_tristate CONFIG_IP_NF_NAT_H323 $CONFIG_IP_NF_NAT +- fi +- fi +- if [ "$CONFIG_IP_NF_PPTP" = "m" ]; then +- define_tristate CONFIG_IP_NF_NAT_PPTP m +- else +- if [ "$CONFIG_IP_NF_PPTP" = "y" ]; then +- define_tristate CONFIG_IP_NF_NAT_PPTP $CONFIG_IP_NF_NAT +- fi +- fi +- if [ "$CONFIG_IP_NF_CT_PROTO_GRE" = "m" ]; then +- define_tristate CONFIG_IP_NF_NAT_PROTO_GRE m +- else +- if [ "$CONFIG_IP_NF_CT_PROTO_GRE" = "y" ]; then +- define_tristate CONFIG_IP_NF_NAT_PROTO_GRE $CONFIG_IP_NF_NAT +- fi +- fi + bool ' NAT of local connections (READ HELP)' CONFIG_IP_NF_NAT_LOCAL + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + dep_tristate ' Basic SNMP-ALG support (EXPERIMENTAL)' CONFIG_IP_NF_NAT_SNMP_BASIC $CONFIG_IP_NF_NAT +@@ -104,13 +67,6 @@ + define_tristate CONFIG_IP_NF_NAT_IRC $CONFIG_IP_NF_NAT + fi + fi +- if [ "$CONFIG_IP_NF_MMS" = "m" ]; then +- define_tristate CONFIG_IP_NF_NAT_MMS m +- else +- if [ "$CONFIG_IP_NF_MMS" = "y" ]; then +- define_tristate CONFIG_IP_NF_NAT_MMS $CONFIG_IP_NF_NAT +- fi +- fi + # If they want FTP, set to $CONFIG_IP_NF_NAT (m or y), + # or $CONFIG_IP_NF_FTP (m or y), whichever is weaker. Argh. + if [ "$CONFIG_IP_NF_FTP" = "m" ]; then +@@ -120,13 +76,6 @@ + define_tristate CONFIG_IP_NF_NAT_FTP $CONFIG_IP_NF_NAT + fi + fi +- if [ "$CONFIG_IP_NF_TFTP" = "m" ]; then +- define_tristate CONFIG_IP_NF_NAT_TFTP m +- else +- if [ "$CONFIG_IP_NF_TFTP" = "y" ]; then +- define_tristate CONFIG_IP_NF_NAT_TFTP $CONFIG_IP_NF_NAT +- fi +- fi + fi + fi + +diff -Nurb src/linux/linux/net/ipv4/netfilter/Makefile src/linux/linux.stock/net/ipv4/netfilter/Makefile +--- src/linux/linux/net/ipv4/netfilter/Makefile 2004-02-19 06:04:35.000000000 -0500 ++++ src/linux/linux.stock/net/ipv4/netfilter/Makefile 2004-05-09 04:13:03.000000000 -0400 +@@ -31,48 +31,20 @@ + # connection tracking + obj-$(CONFIG_IP_NF_CONNTRACK) += ip_conntrack.o + +-# H.323 support +-obj-$(CONFIG_IP_NF_H323) += ip_conntrack_h323.o +-obj-$(CONFIG_IP_NF_NAT_H323) += ip_nat_h323.o +-ifdef CONFIG_IP_NF_NAT_H323 +- export-objs += ip_conntrack_h323.o +-endif +- +- +-# connection tracking protocol helpers +-obj-$(CONFIG_IP_NF_CT_PROTO_GRE) += ip_conntrack_proto_gre.o +-ifdef CONFIG_IP_NF_CT_PROTO_GRE +- export-objs += ip_conntrack_proto_gre.o +-endif +- +-# NAT protocol helpers +-obj-$(CONFIG_IP_NF_NAT_PROTO_GRE) += ip_nat_proto_gre.o +- + # connection tracking helpers +-obj-$(CONFIG_IP_NF_MMS) += ip_conntrack_mms.o +-ifdef CONFIG_IP_NF_NAT_MMS +- export-objs += ip_conntrack_mms.o +-endif +-obj-$(CONFIG_IP_NF_PPTP) += ip_conntrack_pptp.o +-ifdef CONFIG_IP_NF_NAT_PPTP +- export-objs += ip_conntrack_pptp.o +-endif +-obj-$(CONFIG_IP_NF_TFTP) += ip_conntrack_tftp.o + obj-$(CONFIG_IP_NF_FTP) += ip_conntrack_ftp.o + ifdef CONFIG_IP_NF_NAT_FTP + export-objs += ip_conntrack_ftp.o + endif ++ + obj-$(CONFIG_IP_NF_IRC) += ip_conntrack_irc.o + ifdef CONFIG_IP_NF_NAT_IRC + export-objs += ip_conntrack_irc.o + endif + + # NAT helpers +-obj-$(CONFIG_IP_NF_NAT_PPTP) += ip_nat_pptp.o +-obj-$(CONFIG_IP_NF_NAT_TFTP) += ip_nat_tftp.o + obj-$(CONFIG_IP_NF_NAT_FTP) += ip_nat_ftp.o + obj-$(CONFIG_IP_NF_NAT_IRC) += ip_nat_irc.o +-obj-$(CONFIG_IP_NF_NAT_MMS) += ip_nat_mms.o + + # generic IP tables + obj-$(CONFIG_IP_NF_IPTABLES) += ip_tables.o +@@ -86,19 +58,12 @@ + obj-$(CONFIG_IP_NF_MATCH_HELPER) += ipt_helper.o + obj-$(CONFIG_IP_NF_MATCH_LIMIT) += ipt_limit.o + obj-$(CONFIG_IP_NF_MATCH_MARK) += ipt_mark.o +-obj-$(CONFIG_IP_NF_POOL) += ipt_pool.o ip_pool.o + obj-$(CONFIG_IP_NF_MATCH_MAC) += ipt_mac.o + + obj-$(CONFIG_IP_NF_MATCH_PKTTYPE) += ipt_pkttype.o + obj-$(CONFIG_IP_NF_MATCH_MULTIPORT) += ipt_multiport.o +- +-obj-$(CONFIG_IP_NF_MATCH_MPORT) += ipt_mport.o +- + obj-$(CONFIG_IP_NF_MATCH_OWNER) += ipt_owner.o + obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o +- +-obj-$(CONFIG_IP_NF_MATCH_TIME) += ipt_time.o +- + obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o + obj-$(CONFIG_IP_NF_MATCH_DSCP) += ipt_dscp.o + obj-$(CONFIG_IP_NF_MATCH_AH_ESP) += ipt_ah.o ipt_esp.o +@@ -109,7 +74,6 @@ + obj-$(CONFIG_IP_NF_MATCH_STATE) += ipt_state.o + obj-$(CONFIG_IP_NF_MATCH_CONNTRACK) += ipt_conntrack.o + obj-$(CONFIG_IP_NF_MATCH_UNCLEAN) += ipt_unclean.o +-obj-$(CONFIG_IP_NF_MATCH_WEBSTR) += ipt_webstr.o + obj-$(CONFIG_IP_NF_MATCH_TCPMSS) += ipt_tcpmss.o + + # targets +@@ -125,8 +89,6 @@ + obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o + obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o + obj-$(CONFIG_IP_NF_TARGET_TCPMSS) += ipt_TCPMSS.o +-obj-$(CONFIG_IP_NF_AUTOFW) += ip_autofw.o +-obj-$(CONFIG_IP_NF_TARGET_TRIGGER) += ipt_TRIGGER.o + + # generic ARP tables + obj-$(CONFIG_IP_NF_ARPTABLES) += arp_tables.o +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_core.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_core.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_core.c 2003-08-12 07:33:45.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_core.c 2004-05-09 04:13:03.000000000 -0400 +@@ -47,7 +47,11 @@ + + #define IP_CONNTRACK_VERSION "2.1" + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + DECLARE_RWLOCK(ip_conntrack_lock); + DECLARE_RWLOCK(ip_conntrack_expect_tuple_lock); +@@ -62,29 +66,6 @@ + struct list_head *ip_conntrack_hash; + static kmem_cache_t *ip_conntrack_cachep; + +-#define SECS * HZ +-#define MINS * 60 SECS +-#define HOURS * 60 MINS +-#define DAYS * 24 HOURS +- +-int sysctl_ip_conntrack_tcp_timeouts[10] = { +- 30 MINS, /* TCP_CONNTRACK_NONE, */ +- 5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */ +- 2 MINS, /* TCP_CONNTRACK_SYN_SENT, */ +- 60 SECS, /* TCP_CONNTRACK_SYN_RECV, */ +- 2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */ +- 2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */ +- 10 SECS, /* TCP_CONNTRACK_CLOSE, */ +- 60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */ +- 30 SECS, /* TCP_CONNTRACK_LAST_ACK, */ +- 2 MINS, /* TCP_CONNTRACK_LISTEN, */ +-}; +- +-int sysctl_ip_conntrack_udp_timeouts[2] = { +- 30 SECS, /* UNREPLIED */ +- 180 SECS /* ASSURED */ +-}; +- + extern struct ip_conntrack_protocol ip_conntrack_generic_protocol; + + static inline int proto_cmpfn(const struct ip_conntrack_protocol *curr, +@@ -129,6 +110,9 @@ + static inline u_int32_t + hash_conntrack(const struct ip_conntrack_tuple *tuple) + { ++#if 0 ++ dump_tuple(tuple); ++#endif + /* ntohl because more differences in low bits. */ + /* To ensure that halves of the same connection don't hash + clash, we add the source per-proto again. */ +@@ -160,8 +144,6 @@ + tuple->dst.ip = iph->daddr; + tuple->dst.protonum = iph->protocol; + +- tuple->src.u.all = tuple->dst.u.all = 0; +- + ret = protocol->pkt_to_tuple((u_int32_t *)iph + iph->ihl, + len - 4*iph->ihl, + tuple); +@@ -177,8 +159,6 @@ + inverse->dst.ip = orig->src.ip; + inverse->dst.protonum = orig->dst.protonum; + +- inverse->src.u.all = inverse->dst.u.all = 0; +- + return protocol->invert_tuple(inverse, orig); + } + +@@ -196,8 +176,8 @@ + static void + destroy_expect(struct ip_conntrack_expect *exp) + { +- DEBUGP("destroy_expect(%p) use=%d\n", exp, atomic_read(&exp->use)); +- IP_NF_ASSERT(atomic_read(&exp->use)); ++ DEBUGP("destroy_expect(%p) use=%d\n", exp, atomic_read(exp->use)); ++ IP_NF_ASSERT(atomic_read(exp->use)); + IP_NF_ASSERT(!timer_pending(&exp->timeout)); + + kfree(exp); +@@ -267,11 +247,11 @@ + static void unexpect_related(struct ip_conntrack_expect *expect) + { + IP_NF_ASSERT(expect->expectant); ++ IP_NF_ASSERT(expect->expectant->helper); + /* if we are supposed to have a timer, but we can't delete + * it: race condition. __unexpect_related will + * be calledd by timeout function */ +- if (expect->expectant->helper +- && expect->expectant->helper->timeout ++ if (expect->expectant->helper->timeout + && !del_timer(&expect->timeout)) + return; + +@@ -580,6 +560,7 @@ + if (!h) { + /* Locally generated ICMPs will match inverted if they + haven't been SNAT'ed yet */ ++ /* FIXME: NAT code has to handle half-done double NAT --RR */ + if (hooknum == NF_IP_LOCAL_OUT) + h = ip_conntrack_find_get(&origtuple, NULL); + +@@ -725,7 +706,6 @@ + + /* If the expectation is dying, then this is a looser. */ + if (expected +- && expected->expectant->helper + && expected->expectant->helper->timeout + && ! del_timer(&expected->timeout)) + expected = NULL; +@@ -744,7 +724,6 @@ + conntrack->master = expected; + expected->sibling = conntrack; + LIST_DELETE(&ip_conntrack_expect_list, expected); +- INIT_LIST_HEAD(&expected->list); + expected->expectant->expecting--; + nf_conntrack_get(&master_ct(conntrack)->infos[0]); + } +@@ -821,9 +800,23 @@ + int set_reply; + int ret; + ++ /* FIXME: Do this right please. --RR */ + (*pskb)->nfcache |= NFC_UNKNOWN; + + /* Doesn't cover locally-generated broadcast, so not worth it. */ ++#if 0 ++ /* Ignore broadcast: no `connection'. */ ++ if ((*pskb)->pkt_type == PACKET_BROADCAST) { ++ printk("Broadcast packet!\n"); ++ return NF_ACCEPT; ++ } else if (((*pskb)->nh.iph->daddr & htonl(0x000000FF)) ++ == htonl(0x000000FF)) { ++ printk("Should bcast: %u.%u.%u.%u->%u.%u.%u.%u (sk=%p, ptype=%u)\n", ++ NIPQUAD((*pskb)->nh.iph->saddr), ++ NIPQUAD((*pskb)->nh.iph->daddr), ++ (*pskb)->sk, (*pskb)->pkt_type); ++ } ++#endif + + /* Previously seen (loopback)? Ignore. Do this before + fragment check. */ +@@ -943,8 +936,8 @@ + * so there is no need to use the tuple lock too */ + + DEBUGP("ip_conntrack_expect_related %p\n", related_to); +- DEBUGP("tuple: "); DUMP_TUPLE_RAW(&expect->tuple); +- DEBUGP("mask: "); DUMP_TUPLE_RAW(&expect->mask); ++ DEBUGP("tuple: "); DUMP_TUPLE(&expect->tuple); ++ DEBUGP("mask: "); DUMP_TUPLE(&expect->mask); + + old = LIST_FIND(&ip_conntrack_expect_list, resent_expect, + struct ip_conntrack_expect *, &expect->tuple, +@@ -954,8 +947,7 @@ + pointing into the payload - otherwise we should have to copy + the data filled out by the helper over the old one */ + DEBUGP("expect_related: resent packet\n"); +- if (related_to->helper && +- related_to->helper->timeout) { ++ if (related_to->helper->timeout) { + if (!del_timer(&old->timeout)) { + /* expectation is dying. Fall through */ + old = NULL; +@@ -970,32 +962,26 @@ + WRITE_UNLOCK(&ip_conntrack_lock); + return -EEXIST; + } +- } else if (related_to->helper && +- related_to->helper->max_expected && ++ } else if (related_to->helper->max_expected && + related_to->expecting >= related_to->helper->max_expected) { + struct list_head *cur_item; + /* old == NULL */ +- if (!(related_to->helper->flags & +- IP_CT_HELPER_F_REUSE_EXPECT)) { +- WRITE_UNLOCK(&ip_conntrack_lock); + if (net_ratelimit()) + printk(KERN_WARNING + "ip_conntrack: max number of expected " + "connections %i of %s reached for " +- "%u.%u.%u.%u->%u.%u.%u.%u\n", ++ "%u.%u.%u.%u->%u.%u.%u.%u%s\n", + related_to->helper->max_expected, + related_to->helper->name, + NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip), +- NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip)); ++ NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip), ++ related_to->helper->flags & IP_CT_HELPER_F_REUSE_EXPECT ? ++ ", reusing" : ""); ++ if (!(related_to->helper->flags & ++ IP_CT_HELPER_F_REUSE_EXPECT)) { ++ WRITE_UNLOCK(&ip_conntrack_lock); + return -EPERM; + } +- DEBUGP("ip_conntrack: max number of expected " +- "connections %i of %s reached for " +- "%u.%u.%u.%u->%u.%u.%u.%u, reusing\n", +- related_to->helper->max_expected, +- related_to->helper->name, +- NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip), +- NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip)); + + /* choose the the oldest expectation to evict */ + list_for_each(cur_item, &related_to->sibling_list) { +@@ -1055,8 +1041,7 @@ + /* add to global list of expectations */ + list_prepend(&ip_conntrack_expect_list, &new->list); + /* add and start timer if required */ +- if (related_to->helper && +- related_to->helper->timeout) { ++ if (related_to->helper->timeout) { + init_timer(&new->timeout); + new->timeout.data = (unsigned long)new; + new->timeout.function = expectation_timed_out; +@@ -1079,10 +1064,11 @@ + + MUST_BE_READ_LOCKED(&ip_conntrack_lock); + WRITE_LOCK(&ip_conntrack_expect_tuple_lock); ++ + DEBUGP("change_expect:\n"); +- DEBUGP("exp tuple: "); DUMP_TUPLE_RAW(&expect->tuple); +- DEBUGP("exp mask: "); DUMP_TUPLE_RAW(&expect->mask); +- DEBUGP("newtuple: "); DUMP_TUPLE_RAW(newtuple); ++ DEBUGP("exp tuple: "); DUMP_TUPLE(&expect->tuple); ++ DEBUGP("exp mask: "); DUMP_TUPLE(&expect->mask); ++ DEBUGP("newtuple: "); DUMP_TUPLE(newtuple); + if (expect->ct_tuple.dst.protonum == 0) { + /* Never seen before */ + DEBUGP("change expect: never seen before\n"); +@@ -1360,8 +1346,6 @@ + 0, NULL }; + + #define NET_IP_CONNTRACK_MAX 2089 +-#define NET_IP_CONNTRACK_TCP_TIMEOUTS 2090 +-#define NET_IP_CONNTRACK_UDP_TIMEOUTS 2091 + #define NET_IP_CONNTRACK_MAX_NAME "ip_conntrack_max" + + #ifdef CONFIG_SYSCTL +@@ -1370,14 +1354,6 @@ + static ctl_table ip_conntrack_table[] = { + { NET_IP_CONNTRACK_MAX, NET_IP_CONNTRACK_MAX_NAME, &ip_conntrack_max, + sizeof(ip_conntrack_max), 0644, NULL, proc_dointvec }, +- { NET_IP_CONNTRACK_TCP_TIMEOUTS, "ip_conntrack_tcp_timeouts", +- &sysctl_ip_conntrack_tcp_timeouts, +- sizeof(sysctl_ip_conntrack_tcp_timeouts), +- 0644, NULL, &proc_dointvec_jiffies, &sysctl_jiffies }, +- { NET_IP_CONNTRACK_UDP_TIMEOUTS, "ip_conntrack_udp_timeouts", +- &sysctl_ip_conntrack_udp_timeouts, +- sizeof(sysctl_ip_conntrack_udp_timeouts), +- 0644, NULL, &proc_dointvec_jiffies, &sysctl_jiffies }, + { 0 } + }; + +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_ftp.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_ftp.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_ftp.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_ftp.c 2004-05-09 04:13:03.000000000 -0400 +@@ -24,7 +24,11 @@ + static int loose = 0; + MODULE_PARM(loose, "i"); + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + static int try_rfc959(const char *, size_t, u_int32_t [], char); + static int try_eprt(const char *, size_t, u_int32_t [], char); +@@ -191,6 +195,16 @@ + } + + if (strnicmp(data, pattern, plen) != 0) { ++#if 0 ++ size_t i; ++ ++ DEBUGP("ftp: string mismatch\n"); ++ for (i = 0; i < plen; i++) { ++ DEBUGFTP("ftp:char %u `%c'(%u) vs `%c'(%u)\n", ++ i, data[i], data[i], ++ pattern[i], pattern[i]); ++ } ++#endif + return 0; + } + +@@ -214,6 +228,7 @@ + return 1; + } + ++/* FIXME: This should be in userspace. Later. */ + static int help(const struct iphdr *iph, size_t len, + struct ip_conntrack *ct, + enum ip_conntrack_info ctinfo) +@@ -249,6 +264,7 @@ + } + + /* Checksum invalid? Ignore. */ ++ /* FIXME: Source route IP option packets --RR */ + if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr, + csum_partial((char *)tcph, tcplen, 0))) { + DEBUGP("ftp_help: bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n", +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_h323.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_h323.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_h323.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_h323.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,302 +0,0 @@ +-/* +- * H.323 'brute force' extension for H.323 connection tracking. +- * Jozsef Kadlecsik +- * +- * Based on ip_masq_h323.c for 2.2 kernels from CoRiTel, Sofia project. +- * (http://www.coritel.it/projects/sofia/nat/) +- * Uses Sampsa Ranta's excellent idea on using expectfn to 'bind' +- * the unregistered helpers to the conntrack entries. +- */ +- +- +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-MODULE_AUTHOR("Jozsef Kadlecsik "); +-MODULE_DESCRIPTION("H.323 'brute force' connection tracking module"); +-MODULE_LICENSE("GPL"); +- +-DECLARE_LOCK(ip_h323_lock); +-struct module *ip_conntrack_h323 = THIS_MODULE; +- +-#define DEBUGP(format, args...) +- +-static int h245_help(const struct iphdr *iph, size_t len, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo) +-{ +- struct tcphdr *tcph = (void *)iph + iph->ihl * 4; +- unsigned char *data = (unsigned char *) tcph + tcph->doff * 4; +- unsigned char *data_limit; +- u_int32_t tcplen = len - iph->ihl * 4; +- u_int32_t datalen = tcplen - tcph->doff * 4; +- int dir = CTINFO2DIR(ctinfo); +- struct ip_ct_h225_master *info = &ct->help.ct_h225_info; +- struct ip_conntrack_expect expect, *exp = &expect; +- struct ip_ct_h225_expect *exp_info = &exp->help.exp_h225_info; +- u_int16_t data_port; +- u_int32_t data_ip; +- unsigned int i; +- +- DEBUGP("ct_h245_help: help entered %u.%u.%u.%u:%u->%u.%u.%u.%u:%u\n", +- NIPQUAD(iph->saddr), ntohs(tcph->source), +- NIPQUAD(iph->daddr), ntohs(tcph->dest)); +- +- /* Can't track connections formed before we registered */ +- if (!info) +- return NF_ACCEPT; +- +- /* Until there's been traffic both ways, don't look in packets. */ +- if (ctinfo != IP_CT_ESTABLISHED +- && ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { +- DEBUGP("ct_h245_help: Conntrackinfo = %u\n", ctinfo); +- return NF_ACCEPT; +- } +- +- /* Not whole TCP header or too short packet? */ +- if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff * 4 + 5) { +- DEBUGP("ct_h245_help: tcplen = %u\n", (unsigned)tcplen); +- return NF_ACCEPT; +- } +- +- /* Checksum invalid? Ignore. */ +- if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr, +- csum_partial((char *)tcph, tcplen, 0))) { +- DEBUGP("ct_h245_help: bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n", +- tcph, tcplen, NIPQUAD(iph->saddr), +- NIPQUAD(iph->daddr)); +- return NF_ACCEPT; +- } +- +- data_limit = (unsigned char *) data + datalen; +- /* bytes: 0123 45 +- ipadrr port */ +- for (i = 0; data < (data_limit - 5); data++, i++) { +- memcpy(&data_ip, data, sizeof(u_int32_t)); +- if (data_ip == iph->saddr) { +- memcpy(&data_port, data + 4, sizeof(u_int16_t)); +- memset(&expect, 0, sizeof(expect)); +- /* update the H.225 info */ +- DEBUGP("ct_h245_help: new RTCP/RTP requested %u.%u.%u.%u:->%u.%u.%u.%u:%u\n", +- NIPQUAD(ct->tuplehash[!dir].tuple.src.ip), +- NIPQUAD(iph->saddr), ntohs(data_port)); +- LOCK_BH(&ip_h323_lock); +- info->is_h225 = H225_PORT + 1; +- exp_info->port = data_port; +- exp_info->dir = dir; +- exp_info->offset = i; +- +- exp->seq = ntohl(tcph->seq) + i; +- +- exp->tuple = ((struct ip_conntrack_tuple) +- { { ct->tuplehash[!dir].tuple.src.ip, +- { 0 } }, +- { data_ip, +- { data_port }, +- IPPROTO_UDP }}); +- exp->mask = ((struct ip_conntrack_tuple) +- { { 0xFFFFFFFF, { 0 } }, +- { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); +- +- exp->expectfn = NULL; +- +- /* Ignore failure; should only happen with NAT */ +- ip_conntrack_expect_related(ct, exp); +- +- UNLOCK_BH(&ip_h323_lock); +- } +- } +- +- return NF_ACCEPT; +- +-} +- +-/* H.245 helper is not registered! */ +-static struct ip_conntrack_helper h245 = +- { { NULL, NULL }, +- "H.245", /* name */ +- IP_CT_HELPER_F_REUSE_EXPECT, /* flags */ +- NULL, /* module */ +- 8, /* max_ expected */ +- 240, /* timeout */ +- { { 0, { 0 } }, /* tuple */ +- { 0, { 0 }, IPPROTO_TCP } }, +- { { 0, { 0xFFFF } }, /* mask */ +- { 0, { 0 }, 0xFFFF } }, +- h245_help /* helper */ +- }; +- +-static int h225_expect(struct ip_conntrack *ct) +-{ +- WRITE_LOCK(&ip_conntrack_lock); +- ct->helper = &h245; +- DEBUGP("h225_expect: helper for %p added\n", ct); +- WRITE_UNLOCK(&ip_conntrack_lock); +- +- return NF_ACCEPT; /* unused */ +-} +- +-static int h225_help(const struct iphdr *iph, size_t len, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo) +-{ +- struct tcphdr *tcph = (void *)iph + iph->ihl * 4; +- unsigned char *data = (unsigned char *) tcph + tcph->doff * 4; +- unsigned char *data_limit; +- u_int32_t tcplen = len - iph->ihl * 4; +- u_int32_t datalen = tcplen - tcph->doff * 4; +- int dir = CTINFO2DIR(ctinfo); +- struct ip_ct_h225_master *info = &ct->help.ct_h225_info; +- struct ip_conntrack_expect expect, *exp = &expect; +- struct ip_ct_h225_expect *exp_info = &exp->help.exp_h225_info; +- u_int16_t data_port; +- u_int32_t data_ip; +- unsigned int i; +- +- DEBUGP("ct_h225_help: help entered %u.%u.%u.%u:%u->%u.%u.%u.%u:%u\n", +- NIPQUAD(iph->saddr), ntohs(tcph->source), +- NIPQUAD(iph->daddr), ntohs(tcph->dest)); +- +- /* Can't track connections formed before we registered */ +- if (!info) +- return NF_ACCEPT; +- +- /* Until there's been traffic both ways, don't look in packets. */ +- if (ctinfo != IP_CT_ESTABLISHED +- && ctinfo != IP_CT_ESTABLISHED + IP_CT_IS_REPLY) { +- DEBUGP("ct_h225_help: Conntrackinfo = %u\n", ctinfo); +- return NF_ACCEPT; +- } +- +- /* Not whole TCP header or too short packet? */ +- if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff * 4 + 5) { +- DEBUGP("ct_h225_help: tcplen = %u\n", (unsigned)tcplen); +- return NF_ACCEPT; +- } +- +- /* Checksum invalid? Ignore. */ +- if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr, +- csum_partial((char *)tcph, tcplen, 0))) { +- DEBUGP("ct_h225_help: bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n", +- tcph, tcplen, NIPQUAD(iph->saddr), +- NIPQUAD(iph->daddr)); +- return NF_ACCEPT; +- } +- +- data_limit = (unsigned char *) data + datalen; +- /* bytes: 0123 45 +- ipadrr port */ +- for (i = 0; data < (data_limit - 5); data++, i++) { +- memcpy(&data_ip, data, sizeof(u_int32_t)); +- if (data_ip == iph->saddr) { +- memcpy(&data_port, data + 4, sizeof(u_int16_t)); +- if (data_port == tcph->source) { +- /* Signal address */ +- DEBUGP("ct_h225_help: sourceCallSignalAddress from %u.%u.%u.%u\n", +- NIPQUAD(iph->saddr)); +- /* Update the H.225 info so that NAT can mangle the address/port +- even when we have no expected connection! */ +-#ifdef CONFIG_IP_NF_NAT_NEEDED +- LOCK_BH(&ip_h323_lock); +- info->dir = dir; +- info->seq[IP_CT_DIR_ORIGINAL] = ntohl(tcph->seq) + i; +- info->offset[IP_CT_DIR_ORIGINAL] = i; +- UNLOCK_BH(&ip_h323_lock); +-#endif +- } else { +- memset(&expect, 0, sizeof(expect)); +- +- /* update the H.225 info */ +- LOCK_BH(&ip_h323_lock); +- info->is_h225 = H225_PORT; +- exp_info->port = data_port; +- exp_info->dir = dir; +- exp_info->offset = i; +- +- exp->seq = ntohl(tcph->seq) + i; +- +- exp->tuple = ((struct ip_conntrack_tuple) +- { { ct->tuplehash[!dir].tuple.src.ip, +- { 0 } }, +- { data_ip, +- { data_port }, +- IPPROTO_TCP }}); +- exp->mask = ((struct ip_conntrack_tuple) +- { { 0xFFFFFFFF, { 0 } }, +- { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); +- +- exp->expectfn = h225_expect; +- +- /* Ignore failure */ +- ip_conntrack_expect_related(ct, exp); +- +- DEBUGP("ct_h225_help: new H.245 requested %u.%u.%u.%u->%u.%u.%u.%u:%u\n", +- NIPQUAD(ct->tuplehash[!dir].tuple.src.ip), +- NIPQUAD(iph->saddr), ntohs(data_port)); +- +- UNLOCK_BH(&ip_h323_lock); +- } +-#ifdef CONFIG_IP_NF_NAT_NEEDED +- } else if (data_ip == iph->daddr) { +- memcpy(&data_port, data + 4, sizeof(u_int16_t)); +- if (data_port == tcph->dest) { +- /* Signal address */ +- DEBUGP("ct_h225_help: destCallSignalAddress %u.%u.%u.%u\n", +- NIPQUAD(iph->daddr)); +- /* Update the H.225 info so that NAT can mangle the address/port +- even when we have no expected connection! */ +- LOCK_BH(&ip_h323_lock); +- info->dir = dir; +- info->seq[IP_CT_DIR_REPLY] = ntohl(tcph->seq) + i; +- info->offset[IP_CT_DIR_REPLY] = i; +- UNLOCK_BH(&ip_h323_lock); +- } +-#endif +- } +- } +- +- return NF_ACCEPT; +- +-} +- +-static struct ip_conntrack_helper h225 = +- { { NULL, NULL }, +- "H.225", /* name */ +- IP_CT_HELPER_F_REUSE_EXPECT, /* flags */ +- THIS_MODULE, /* module */ +- 2, /* max_expected */ +- 240, /* timeout */ +- { { 0, { __constant_htons(H225_PORT) } }, /* tuple */ +- { 0, { 0 }, IPPROTO_TCP } }, +- { { 0, { 0xFFFF } }, /* mask */ +- { 0, { 0 }, 0xFFFF } }, +- h225_help /* helper */ +- }; +- +-static int __init init(void) +-{ +- return ip_conntrack_helper_register(&h225); +-} +- +-static void __exit fini(void) +-{ +- /* Unregister H.225 helper */ +- ip_conntrack_helper_unregister(&h225); +-} +- +-#ifdef CONFIG_IP_NF_NAT_NEEDED +-EXPORT_SYMBOL(ip_h323_lock); +-#endif +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_mms.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_mms.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_mms.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_mms.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,292 +0,0 @@ +-/* MMS extension for IP connection tracking +- * (C) 2002 by Filip Sneppe +- * based on ip_conntrack_ftp.c and ip_conntrack_irc.c +- * +- * ip_conntrack_mms.c v0.3 2002-09-22 +- * +- * 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. +- * +- * Module load syntax: +- * insmod ip_conntrack_mms.o ports=port1,port2,...port +- * +- * Please give the ports of all MMS servers You wish to connect to. +- * If you don't specify ports, the default will be TCP port 1755. +- * +- * More info on MMS protocol, firewalls and NAT: +- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/MMSFirewall.asp +- * http://www.microsoft.com/windows/windowsmedia/serve/firewall.asp +- * +- * The SDP project people are reverse-engineering MMS: +- * http://get.to/sdp +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +- +-DECLARE_LOCK(ip_mms_lock); +-struct module *ip_conntrack_mms = THIS_MODULE; +- +-#define MAX_PORTS 8 +-static int ports[MAX_PORTS]; +-static int ports_c; +-#ifdef MODULE_PARM +-MODULE_PARM(ports, "1-" __MODULE_STRING(MAX_PORTS) "i"); +-#endif +- +-#define DEBUGP(format, args...) +- +-#ifdef CONFIG_IP_NF_NAT_NEEDED +-EXPORT_SYMBOL(ip_mms_lock); +-#endif +- +-MODULE_AUTHOR("Filip Sneppe "); +-MODULE_DESCRIPTION("Microsoft Windows Media Services (MMS) connection tracking module"); +-MODULE_LICENSE("GPL"); +- +-/* #define isdigit(c) (c >= '0' && c <= '9') */ +- +-/* copied from drivers/usb/serial/io_edgeport.c - not perfect but will do the trick */ +-static void unicode_to_ascii (char *string, short *unicode, int unicode_size) +-{ +- int i; +- for (i = 0; i < unicode_size; ++i) { +- string[i] = (char)(unicode[i]); +- } +- string[unicode_size] = 0x00; +-} +- +-__inline static int atoi(char *s) +-{ +- int i=0; +- while (isdigit(*s)) { +- i = i*10 + *(s++) - '0'; +- } +- return i; +-} +- +-/* convert ip address string like "192.168.0.10" to unsigned int */ +-__inline static u_int32_t asciiiptoi(char *s) +-{ +- unsigned int i, j, k; +- +- for(i=k=0; k<3; ++k, ++s, i<<=8) { +- i+=atoi(s); +- for(j=0; (*(++s) != '.') && (j<3); ++j) +- ; +- } +- i+=atoi(s); +- return ntohl(i); +-} +- +-int parse_mms(const char *data, +- const unsigned int datalen, +- u_int32_t *mms_ip, +- u_int16_t *mms_proto, +- u_int16_t *mms_port, +- char **mms_string_b, +- char **mms_string_e, +- char **mms_padding_e) +-{ +- int unicode_size, i; +- char tempstring[28]; /* "\\255.255.255.255\UDP\65535" */ +- char getlengthstring[28]; +- +- for(unicode_size=0; +- (char) *(data+(MMS_SRV_UNICODE_STRING_OFFSET+unicode_size*2)) != (char)0; +- unicode_size++) +- if ((unicode_size == 28) || (MMS_SRV_UNICODE_STRING_OFFSET+unicode_size*2 >= datalen)) +- return -1; /* out of bounds - incomplete packet */ +- +- unicode_to_ascii(tempstring, (short *)(data+MMS_SRV_UNICODE_STRING_OFFSET), unicode_size); +- DEBUGP("ip_conntrack_mms: offset 60: %s\n", (const char *)(tempstring)); +- +- /* IP address ? */ +- *mms_ip = asciiiptoi(tempstring+2); +- +- i=sprintf(getlengthstring, "%u.%u.%u.%u", HIPQUAD(*mms_ip)); +- +- /* protocol ? */ +- if(strncmp(tempstring+3+i, "TCP", 3)==0) +- *mms_proto = IPPROTO_TCP; +- else if(strncmp(tempstring+3+i, "UDP", 3)==0) +- *mms_proto = IPPROTO_UDP; +- +- /* port ? */ +- *mms_port = atoi(tempstring+7+i); +- +- /* we store a pointer to the beginning of the "\\a.b.c.d\proto\port" +- unicode string, one to the end of the string, and one to the end +- of the packet, since we must keep track of the number of bytes +- between end of the unicode string and the end of packet (padding) */ +- *mms_string_b = (char *)(data + MMS_SRV_UNICODE_STRING_OFFSET); +- *mms_string_e = (char *)(data + MMS_SRV_UNICODE_STRING_OFFSET + unicode_size * 2); +- *mms_padding_e = (char *)(data + datalen); /* looks funny, doesn't it */ +- return 0; +-} +- +- +-static int help(const struct iphdr *iph, size_t len, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo) +-{ +- /* tcplen not negative guaranteed by ip_conntrack_tcp.c */ +- struct tcphdr *tcph = (void *)iph + iph->ihl * 4; +- const char *data = (const char *)tcph + tcph->doff * 4; +- unsigned int tcplen = len - iph->ihl * 4; +- unsigned int datalen = tcplen - tcph->doff * 4; +- int dir = CTINFO2DIR(ctinfo); +- struct ip_conntrack_expect expect, *exp = &expect; +- struct ip_ct_mms_expect *exp_mms_info = &exp->help.exp_mms_info; +- +- u_int32_t mms_ip; +- u_int16_t mms_proto; +- char mms_proto_string[8]; +- u_int16_t mms_port; +- char *mms_string_b, *mms_string_e, *mms_padding_e; +- +- /* Until there's been traffic both ways, don't look in packets. */ +- if (ctinfo != IP_CT_ESTABLISHED +- && ctinfo != IP_CT_ESTABLISHED+IP_CT_IS_REPLY) { +- DEBUGP("ip_conntrack_mms: Conntrackinfo = %u\n", ctinfo); +- return NF_ACCEPT; +- } +- +- /* Not whole TCP header? */ +- if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff*4) { +- DEBUGP("ip_conntrack_mms: tcplen = %u\n", (unsigned)tcplen); +- return NF_ACCEPT; +- } +- +- /* Checksum invalid? Ignore. */ +- if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr, +- csum_partial((char *)tcph, tcplen, 0))) { +- DEBUGP("mms_help: bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n", +- tcph, tcplen, NIPQUAD(iph->saddr), +- NIPQUAD(iph->daddr)); +- return NF_ACCEPT; +- } +- +- /* Only look at packets with 0x00030002/196610 on bytes 36->39 of TCP payload */ +- if( (MMS_SRV_MSG_OFFSET < datalen) && +- ((*(u32 *)(data+MMS_SRV_MSG_OFFSET)) == MMS_SRV_MSG_ID)) { +- DEBUGP("ip_conntrack_mms: offset 37: %u %u %u %u, datalen:%u\n", +- (u8)*(data+36), (u8)*(data+37), +- (u8)*(data+38), (u8)*(data+39), +- datalen); +- if(parse_mms(data, datalen, &mms_ip, &mms_proto, &mms_port, +- &mms_string_b, &mms_string_e, &mms_padding_e)) +- if(net_ratelimit()) +- printk(KERN_WARNING +- "ip_conntrack_mms: Unable to parse data payload\n"); +- +- memset(&expect, 0, sizeof(expect)); +- +- sprintf(mms_proto_string, "(%u)", mms_proto); +- DEBUGP("ip_conntrack_mms: adding %s expectation %u.%u.%u.%u -> %u.%u.%u.%u:%u\n", +- mms_proto == IPPROTO_TCP ? "TCP" +- : mms_proto == IPPROTO_UDP ? "UDP":mms_proto_string, +- NIPQUAD(ct->tuplehash[!dir].tuple.src.ip), +- NIPQUAD(mms_ip), +- mms_port); +- +- /* it's possible that the client will just ask the server to tunnel +- the stream over the same TCP session (from port 1755): there's +- shouldn't be a need to add an expectation in that case, but it +- makes NAT packet mangling so much easier */ +- LOCK_BH(&ip_mms_lock); +- +- DEBUGP("ip_conntrack_mms: tcph->seq = %u\n", tcph->seq); +- +- exp->seq = ntohl(tcph->seq) + (mms_string_b - data); +- exp_mms_info->len = (mms_string_e - mms_string_b); +- exp_mms_info->padding = (mms_padding_e - mms_string_e); +- exp_mms_info->port = mms_port; +- +- DEBUGP("ip_conntrack_mms: wrote info seq=%u (ofs=%u), len=%d, padding=%u\n", +- exp->seq, (mms_string_e - data), exp_mms_info->len, exp_mms_info->padding); +- +- exp->tuple = ((struct ip_conntrack_tuple) +- { { ct->tuplehash[!dir].tuple.src.ip, { 0 } }, +- { mms_ip, +- { (__u16) ntohs(mms_port) }, +- mms_proto } } +- ); +- exp->mask = ((struct ip_conntrack_tuple) +- { { 0xFFFFFFFF, { 0 } }, +- { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }}); +- exp->expectfn = NULL; +- ip_conntrack_expect_related(ct, &expect); +- UNLOCK_BH(&ip_mms_lock); +- } +- +- return NF_ACCEPT; +-} +- +-static struct ip_conntrack_helper mms[MAX_PORTS]; +-static char mms_names[MAX_PORTS][10]; +- +-/* Not __exit: called from init() */ +-static void fini(void) +-{ +- int i; +- for (i = 0; (i < MAX_PORTS) && ports[i]; i++) { +- DEBUGP("ip_conntrack_mms: unregistering helper for port %d\n", +- ports[i]); +- ip_conntrack_helper_unregister(&mms[i]); +- } +-} +- +-static int __init init(void) +-{ +- int i, ret; +- char *tmpname; +- +- if (ports[0] == 0) +- ports[0] = MMS_PORT; +- +- for (i = 0; (i < MAX_PORTS) && ports[i]; i++) { +- memset(&mms[i], 0, sizeof(struct ip_conntrack_helper)); +- mms[i].tuple.src.u.tcp.port = htons(ports[i]); +- mms[i].tuple.dst.protonum = IPPROTO_TCP; +- mms[i].mask.src.u.tcp.port = 0xFFFF; +- mms[i].mask.dst.protonum = 0xFFFF; +- mms[i].max_expected = 1; +- mms[i].timeout = 0; +- mms[i].flags = IP_CT_HELPER_F_REUSE_EXPECT; +- mms[i].me = THIS_MODULE; +- mms[i].help = help; +- +- tmpname = &mms_names[i][0]; +- if (ports[i] == MMS_PORT) +- sprintf(tmpname, "mms"); +- else +- sprintf(tmpname, "mms-%d", ports[i]); +- mms[i].name = tmpname; +- +- DEBUGP("ip_conntrack_mms: registering helper for port %d\n", +- ports[i]); +- ret = ip_conntrack_helper_register(&mms[i]); +- +- if (ret) { +- fini(); +- return ret; +- } +- ports_c++; +- } +- return 0; +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_pptp.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_pptp.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_pptp.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_pptp.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,531 +0,0 @@ +-/* +- * ip_conntrack_pptp.c - Version 1.11 +- * +- * Connection tracking support for PPTP (Point to Point Tunneling Protocol). +- * PPTP is a a protocol for creating virtual private networks. +- * It is a specification defined by Microsoft and some vendors +- * working with Microsoft. PPTP is built on top of a modified +- * version of the Internet Generic Routing Encapsulation Protocol. +- * GRE is defined in RFC 1701 and RFC 1702. Documentation of +- * PPTP can be found in RFC 2637 +- * +- * (C) 2000-2002 by Harald Welte , +- * +- * Development of this code funded by Astaro AG (http://www.astaro.com/) +- * +- * Limitations: +- * - We blindly assume that control connections are always +- * established in PNS->PAC direction. This is a violation +- * of RFFC2673 +- * +- * TODO: - finish support for multiple calls within one session +- * (needs expect reservations in newnat) +- * - testing of incoming PPTP calls +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +- +-MODULE_LICENSE("GPL"); +-MODULE_AUTHOR("Harald Welte "); +-MODULE_DESCRIPTION("Netfilter connection tracking helper module for PPTP"); +- +-DECLARE_LOCK(ip_pptp_lock); +- +-#define DEBUGP(format, args...) +- +-#define SECS *HZ +-#define MINS * 60 SECS +-#define HOURS * 60 MINS +-#define DAYS * 24 HOURS +- +-#define PPTP_GRE_TIMEOUT (10 MINS) +-#define PPTP_GRE_STREAM_TIMEOUT (5 DAYS) +- +-static int pptp_expectfn(struct ip_conntrack *ct) +-{ +- struct ip_conntrack_expect *exp, *other_exp; +- struct ip_conntrack *master; +- +- DEBUGP("increasing timeouts\n"); +- /* increase timeout of GRE data channel conntrack entry */ +- ct->proto.gre.timeout = PPTP_GRE_TIMEOUT; +- ct->proto.gre.stream_timeout = PPTP_GRE_STREAM_TIMEOUT; +- +- master = master_ct(ct); +- if (!master) { +- DEBUGP(" no master!!!\n"); +- return 0; +- } +- +- DEBUGP("completing tuples with ct info\n"); +- /* we can do this, since we're unconfirmed */ +- if (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u.gre.key == +- htonl(master->help.ct_pptp_info.pac_call_id)) { +- /* assume PNS->PAC */ +- ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.gre.key = +- htonl(master->help.ct_pptp_info.pns_call_id); +- ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u.gre.key = +- htonl(master->help.ct_pptp_info.pns_call_id); +- } else { +- /* assume PAC->PNS */ +- ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.gre.key = +- htonl(master->help.ct_pptp_info.pac_call_id); +- ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u.gre.key = +- htonl(master->help.ct_pptp_info.pns_call_id); +- } +- +- return 0; +-} +- +-/* timeout GRE data connections */ +-static int pptp_timeout_related(struct ip_conntrack *ct) +-{ +- struct list_head *cur_item; +- struct ip_conntrack_expect *exp; +- +- list_for_each(cur_item, &ct->sibling_list) { +- exp = list_entry(cur_item, struct ip_conntrack_expect, +- expected_list); +- +- if (!exp->sibling) +- continue; +- +- DEBUGP("setting timeout of conntrack %p to 0\n", +- exp->sibling); +- exp->sibling->proto.gre.timeout = 0; +- exp->sibling->proto.gre.stream_timeout = 0; +- ip_ct_refresh(exp->sibling, 0); +- } +- +- return 0; +-} +- +-/* expect GRE connection in PNS->PAC direction */ +-static inline int +-exp_gre(struct ip_conntrack *master, +- u_int32_t seq, +- u_int16_t callid, +- u_int16_t peer_callid) +-{ +- struct ip_conntrack_expect exp; +- struct ip_conntrack_tuple inv_tuple; +- +- memset(&exp, 0, sizeof(exp)); +- /* tuple in original direction, PAC->PNS */ +- exp.tuple.src.ip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip; +- exp.tuple.src.u.gre.key = htonl(ntohs(peer_callid)); +- exp.tuple.dst.ip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip; +- exp.tuple.dst.u.gre.key = htonl(ntohs(callid)); +- exp.tuple.dst.u.gre.protocol = __constant_htons(GRE_PROTOCOL_PPTP); +- exp.tuple.dst.u.gre.version = GRE_VERSION_PPTP; +- exp.tuple.dst.protonum = IPPROTO_GRE; +- +- exp.mask.src.ip = 0xffffffff; +- exp.mask.src.u.all = 0; +- exp.mask.dst.u.all = 0; +- exp.mask.dst.u.gre.key = 0xffffffff; +- exp.mask.dst.u.gre.version = 0xff; +- exp.mask.dst.u.gre.protocol = 0xffff; +- exp.mask.dst.ip = 0xffffffff; +- exp.mask.dst.protonum = 0xffff; +- +- exp.seq = seq; +- exp.expectfn = pptp_expectfn; +- +- exp.help.exp_pptp_info.pac_call_id = ntohs(callid); +- exp.help.exp_pptp_info.pns_call_id = ntohs(peer_callid); +- +- DEBUGP("calling expect_related "); +- DUMP_TUPLE_RAW(&exp.tuple); +- +- /* Add GRE keymap entries */ +- ip_ct_gre_keymap_add(&exp, &exp.tuple, 0); +- invert_tuplepr(&inv_tuple, &exp.tuple); +- ip_ct_gre_keymap_add(&exp, &inv_tuple, 1); +- +- ip_conntrack_expect_related(master, &exp); +- +- return 0; +-} +- +-static inline int +-pptp_inbound_pkt(struct tcphdr *tcph, +- struct pptp_pkt_hdr *pptph, +- size_t datalen, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo) +-{ +- struct PptpControlHeader *ctlh; +- union pptp_ctrl_union pptpReq; +- +- struct ip_ct_pptp_master *info = &ct->help.ct_pptp_info; +- u_int16_t msg, *cid, *pcid; +- u_int32_t seq; +- +- ctlh = (struct PptpControlHeader *) +- ((char *) pptph + sizeof(struct pptp_pkt_hdr)); +- pptpReq.rawreq = (void *) +- ((char *) ctlh + sizeof(struct PptpControlHeader)); +- +- msg = ntohs(ctlh->messageType); +- DEBUGP("inbound control message %s\n", strMName[msg]); +- +- switch (msg) { +- case PPTP_START_SESSION_REPLY: +- /* server confirms new control session */ +- if (info->sstate < PPTP_SESSION_REQUESTED) { +- DEBUGP("%s without START_SESS_REQUEST\n", +- strMName[msg]); +- break; +- } +- if (pptpReq.srep->resultCode == PPTP_START_OK) +- info->sstate = PPTP_SESSION_CONFIRMED; +- else +- info->sstate = PPTP_SESSION_ERROR; +- break; +- +- case PPTP_STOP_SESSION_REPLY: +- /* server confirms end of control session */ +- if (info->sstate > PPTP_SESSION_STOPREQ) { +- DEBUGP("%s without STOP_SESS_REQUEST\n", +- strMName[msg]); +- break; +- } +- if (pptpReq.strep->resultCode == PPTP_STOP_OK) +- info->sstate = PPTP_SESSION_NONE; +- else +- info->sstate = PPTP_SESSION_ERROR; +- break; +- +- case PPTP_OUT_CALL_REPLY: +- /* server accepted call, we now expect GRE frames */ +- if (info->sstate != PPTP_SESSION_CONFIRMED) { +- DEBUGP("%s but no session\n", strMName[msg]); +- break; +- } +- if (info->cstate != PPTP_CALL_OUT_REQ && +- info->cstate != PPTP_CALL_OUT_CONF) { +- DEBUGP("%s without OUTCALL_REQ\n", strMName[msg]); +- break; +- } +- if (pptpReq.ocack->resultCode != PPTP_OUTCALL_CONNECT) { +- info->cstate = PPTP_CALL_NONE; +- break; +- } +- +- cid = &pptpReq.ocack->callID; +- pcid = &pptpReq.ocack->peersCallID; +- +- info->pac_call_id = ntohs(*cid); +- +- if (htons(info->pns_call_id) != *pcid) { +- DEBUGP("%s for unknown callid %u\n", +- strMName[msg], ntohs(*pcid)); +- break; +- } +- +- DEBUGP("%s, CID=%X, PCID=%X\n", strMName[msg], +- ntohs(*cid), ntohs(*pcid)); +- +- info->cstate = PPTP_CALL_OUT_CONF; +- +- seq = ntohl(tcph->seq) + ((void *)pcid - (void *)pptph); +- exp_gre(ct, seq, *cid, *pcid); +- break; +- +- case PPTP_IN_CALL_REQUEST: +- /* server tells us about incoming call request */ +- if (info->sstate != PPTP_SESSION_CONFIRMED) { +- DEBUGP("%s but no session\n", strMName[msg]); +- break; +- } +- pcid = &pptpReq.icack->peersCallID; +- DEBUGP("%s, PCID=%X\n", strMName[msg], ntohs(*pcid)); +- info->cstate = PPTP_CALL_IN_REQ; +- info->pac_call_id= ntohs(*pcid); +- break; +- +- case PPTP_IN_CALL_CONNECT: +- /* server tells us about incoming call established */ +- if (info->sstate != PPTP_SESSION_CONFIRMED) { +- DEBUGP("%s but no session\n", strMName[msg]); +- break; +- } +- if (info->sstate != PPTP_CALL_IN_REP +- && info->sstate != PPTP_CALL_IN_CONF) { +- DEBUGP("%s but never sent IN_CALL_REPLY\n", +- strMName[msg]); +- break; +- } +- +- pcid = &pptpReq.iccon->peersCallID; +- cid = &info->pac_call_id; +- +- if (info->pns_call_id != ntohs(*pcid)) { +- DEBUGP("%s for unknown CallID %u\n", +- strMName[msg], ntohs(*cid)); +- break; +- } +- +- DEBUGP("%s, PCID=%X\n", strMName[msg], ntohs(*pcid)); +- info->cstate = PPTP_CALL_IN_CONF; +- +- /* we expect a GRE connection from PAC to PNS */ +- seq = ntohl(tcph->seq) + ((void *)pcid - (void *)pptph); +- exp_gre(ct, seq, *cid, *pcid); +- +- break; +- +- case PPTP_CALL_DISCONNECT_NOTIFY: +- /* server confirms disconnect */ +- cid = &pptpReq.disc->callID; +- DEBUGP("%s, CID=%X\n", strMName[msg], ntohs(*cid)); +- info->cstate = PPTP_CALL_NONE; +- +- /* untrack this call id, unexpect GRE packets */ +- pptp_timeout_related(ct); +- /* NEWNAT: look up exp for call id and unexpct_related */ +- break; +- +- case PPTP_WAN_ERROR_NOTIFY: +- break; +- +- case PPTP_ECHO_REQUEST: +- case PPTP_ECHO_REPLY: +- /* I don't have to explain these ;) */ +- break; +- default: +- DEBUGP("invalid %s (TY=%d)\n", (msg <= PPTP_MSG_MAX) +- ? strMName[msg]:strMName[0], msg); +- break; +- } +- +- return NF_ACCEPT; +- +-} +- +-static inline int +-pptp_outbound_pkt(struct tcphdr *tcph, +- struct pptp_pkt_hdr *pptph, +- size_t datalen, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo) +-{ +- struct PptpControlHeader *ctlh; +- union pptp_ctrl_union pptpReq; +- struct ip_ct_pptp_master *info = &ct->help.ct_pptp_info; +- u_int16_t msg, *cid, *pcid; +- +- ctlh = (struct PptpControlHeader *) ((void *) pptph + sizeof(*pptph)); +- pptpReq.rawreq = (void *) ((void *) ctlh + sizeof(*ctlh)); +- +- msg = ntohs(ctlh->messageType); +- DEBUGP("outbound control message %s\n", strMName[msg]); +- +- switch (msg) { +- case PPTP_START_SESSION_REQUEST: +- /* client requests for new control session */ +- if (info->sstate != PPTP_SESSION_NONE) { +- DEBUGP("%s but we already have one", +- strMName[msg]); +- } +- info->sstate = PPTP_SESSION_REQUESTED; +- break; +- case PPTP_STOP_SESSION_REQUEST: +- /* client requests end of control session */ +- info->sstate = PPTP_SESSION_STOPREQ; +- break; +- +- case PPTP_OUT_CALL_REQUEST: +- /* client initiating connection to server */ +- if (info->sstate != PPTP_SESSION_CONFIRMED) { +- DEBUGP("%s but no session\n", +- strMName[msg]); +- break; +- } +- info->cstate = PPTP_CALL_OUT_REQ; +- /* track PNS call id */ +- cid = &pptpReq.ocreq->callID; +- DEBUGP("%s, CID=%X\n", strMName[msg], ntohs(*cid)); +- info->pns_call_id = ntohs(*cid); +- break; +- case PPTP_IN_CALL_REPLY: +- /* client answers incoming call */ +- if (info->cstate != PPTP_CALL_IN_REQ +- && info->cstate != PPTP_CALL_IN_REP) { +- DEBUGP("%s without incall_req\n", +- strMName[msg]); +- break; +- } +- if (pptpReq.icack->resultCode != PPTP_INCALL_ACCEPT) { +- info->cstate = PPTP_CALL_NONE; +- break; +- } +- pcid = &pptpReq.icack->peersCallID; +- if (info->pac_call_id != ntohs(*pcid)) { +- DEBUGP("%s for unknown call %u\n", +- strMName[msg], ntohs(*pcid)); +- break; +- } +- DEBUGP("%s, CID=%X\n", strMName[msg], ntohs(*pcid)); +- /* part two of the three-way handshake */ +- info->cstate = PPTP_CALL_IN_REP; +- info->pns_call_id = ntohs(pptpReq.icack->callID); +- break; +- +- case PPTP_CALL_CLEAR_REQUEST: +- /* client requests hangup of call */ +- if (info->sstate != PPTP_SESSION_CONFIRMED) { +- DEBUGP("CLEAR_CALL but no session\n"); +- break; +- } +- /* FUTURE: iterate over all calls and check if +- * call ID is valid. We don't do this without newnat, +- * because we only know about last call */ +- info->cstate = PPTP_CALL_CLEAR_REQ; +- break; +- case PPTP_SET_LINK_INFO: +- break; +- case PPTP_ECHO_REQUEST: +- case PPTP_ECHO_REPLY: +- /* I don't have to explain these ;) */ +- break; +- default: +- DEBUGP("invalid %s (TY=%d)\n", (msg <= PPTP_MSG_MAX)? +- strMName[msg]:strMName[0], msg); +- /* unknown: no need to create GRE masq table entry */ +- break; +- } +- +- return NF_ACCEPT; +-} +- +- +-/* track caller id inside control connection, call expect_related */ +-static int +-conntrack_pptp_help(const struct iphdr *iph, size_t len, +- struct ip_conntrack *ct, enum ip_conntrack_info ctinfo) +- +-{ +- struct pptp_pkt_hdr *pptph; +- +- struct tcphdr *tcph = (void *) iph + iph->ihl * 4; +- u_int32_t tcplen = len - iph->ihl * 4; +- u_int32_t datalen = tcplen - tcph->doff * 4; +- void *datalimit; +- int dir = CTINFO2DIR(ctinfo); +- struct ip_ct_pptp_master *info = &ct->help.ct_pptp_info; +- +- int oldsstate, oldcstate; +- int ret; +- +- /* don't do any tracking before tcp handshake complete */ +- if (ctinfo != IP_CT_ESTABLISHED +- && ctinfo != IP_CT_ESTABLISHED+IP_CT_IS_REPLY) { +- DEBUGP("ctinfo = %u, skipping\n", ctinfo); +- return NF_ACCEPT; +- } +- +- /* not a complete TCP header? */ +- if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff * 4) { +- DEBUGP("tcplen = %u\n", tcplen); +- return NF_ACCEPT; +- } +- +- /* checksum invalid? */ +- if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr, +- csum_partial((char *) tcph, tcplen, 0))) { +- printk(KERN_NOTICE __FILE__ ": bad csum\n"); +-// return NF_ACCEPT; +- } +- +- if (tcph->fin || tcph->rst) { +- DEBUGP("RST/FIN received, timeouting GRE\n"); +- /* can't do this after real newnat */ +- info->cstate = PPTP_CALL_NONE; +- +- /* untrack this call id, unexpect GRE packets */ +- pptp_timeout_related(ct); +- /* no need to call unexpect_related since master conn +- * dies anyway */ +- } +- +- +- pptph = (struct pptp_pkt_hdr *) ((void *) tcph + tcph->doff * 4); +- datalimit = (void *) pptph + datalen; +- +- /* not a full pptp packet header? */ +- if ((void *) pptph+sizeof(*pptph) >= datalimit) { +- DEBUGP("no full PPTP header, can't track\n"); +- return NF_ACCEPT; +- } +- +- /* if it's not a control message we can't do anything with it */ +- if (ntohs(pptph->packetType) != PPTP_PACKET_CONTROL || +- ntohl(pptph->magicCookie) != PPTP_MAGIC_COOKIE) { +- DEBUGP("not a control packet\n"); +- return NF_ACCEPT; +- } +- +- oldsstate = info->sstate; +- oldcstate = info->cstate; +- +- LOCK_BH(&ip_pptp_lock); +- +- if (dir == IP_CT_DIR_ORIGINAL) +- /* client -> server (PNS -> PAC) */ +- ret = pptp_outbound_pkt(tcph, pptph, datalen, ct, ctinfo); +- else +- /* server -> client (PAC -> PNS) */ +- ret = pptp_inbound_pkt(tcph, pptph, datalen, ct, ctinfo); +- DEBUGP("sstate: %d->%d, cstate: %d->%d\n", +- oldsstate, info->sstate, oldcstate, info->cstate); +- UNLOCK_BH(&ip_pptp_lock); +- +- return ret; +-} +- +-/* control protocol helper */ +-static struct ip_conntrack_helper pptp = { +- { NULL, NULL }, +- "pptp", IP_CT_HELPER_F_REUSE_EXPECT, THIS_MODULE, 2, 0, +- { { 0, { tcp: { port: __constant_htons(PPTP_CONTROL_PORT) } } }, +- { 0, { 0 }, IPPROTO_TCP } }, +- { { 0, { tcp: { port: 0xffff } } }, +- { 0, { 0 }, 0xffff } }, +- conntrack_pptp_help }; +- +-/* ip_conntrack_pptp initialization */ +-static int __init init(void) +-{ +- int retcode; +- +- DEBUGP(__FILE__ ": registering helper\n"); +- if ((retcode = ip_conntrack_helper_register(&pptp))) { +- printk(KERN_ERR "Unable to register conntrack application " +- "helper for pptp: %d\n", retcode); +- return -EIO; +- } +- +- return 0; +-} +- +-static void __exit fini(void) +-{ +- ip_conntrack_helper_unregister(&pptp); +-} +- +-module_init(init); +-module_exit(fini); +- +-EXPORT_SYMBOL(ip_pptp_lock); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_pptp_priv.h src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_pptp_priv.h +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_pptp_priv.h 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_pptp_priv.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,24 +0,0 @@ +-#ifndef _IP_CT_PPTP_PRIV_H +-#define _IP_CT_PPTP_PRIV_H +- +-/* PptpControlMessageType names */ +-static const char *strMName[] = { +- "UNKNOWN_MESSAGE", +- "START_SESSION_REQUEST", +- "START_SESSION_REPLY", +- "STOP_SESSION_REQUEST", +- "STOP_SESSION_REPLY", +- "ECHO_REQUEST", +- "ECHO_REPLY", +- "OUT_CALL_REQUEST", +- "OUT_CALL_REPLY", +- "IN_CALL_REQUEST", +- "IN_CALL_REPLY", +- "IN_CALL_CONNECT", +- "CALL_CLEAR_REQUEST", +- "CALL_DISCONNECT_NOTIFY", +- "WAN_ERROR_NOTIFY", +- "SET_LINK_INFO" +-}; +- +-#endif +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_proto_gre.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_proto_gre.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_proto_gre.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_proto_gre.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,320 +0,0 @@ +-/* +- * ip_conntrack_proto_gre.c - Version 1.11 +- * +- * Connection tracking protocol helper module for GRE. +- * +- * GRE is a generic encapsulation protocol, which is generally not very +- * suited for NAT, as it has no protocol-specific part as port numbers. +- * +- * It has an optional key field, which may help us distinguishing two +- * connections between the same two hosts. +- * +- * GRE is defined in RFC 1701 and RFC 1702, as well as RFC 2784 +- * +- * PPTP is built on top of a modified version of GRE, and has a mandatory +- * field called "CallID", which serves us for the same purpose as the key +- * field in plain GRE. +- * +- * Documentation about PPTP can be found in RFC 2637 +- * +- * (C) 2000-2002 by Harald Welte +- * +- * Development of this code funded by Astaro AG (http://www.astaro.com/) +- * +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +- +-DECLARE_RWLOCK(ip_ct_gre_lock); +-#define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_ct_gre_lock) +-#define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_ct_gre_lock) +- +-#include +-#include +-#include +-#include +- +-#include +-#include +- +-MODULE_LICENSE("GPL"); +-MODULE_AUTHOR("Harald Welte "); +-MODULE_DESCRIPTION("netfilter connection tracking protocol helper for GRE"); +- +-/* shamelessly stolen from ip_conntrack_proto_udp.c */ +-#define GRE_TIMEOUT (30*HZ) +-#define GRE_STREAM_TIMEOUT (180*HZ) +- +-#define DEBUGP(x, args...) +-#define DUMP_TUPLE_GRE(x) +- +-/* GRE KEYMAP HANDLING FUNCTIONS */ +-static LIST_HEAD(gre_keymap_list); +- +-static inline int gre_key_cmpfn(const struct ip_ct_gre_keymap *km, +- const struct ip_conntrack_tuple *t) +-{ +- return ((km->tuple.src.ip == t->src.ip) && +- (km->tuple.dst.ip == t->dst.ip) && +- (km->tuple.dst.protonum == t->dst.protonum) && +- (km->tuple.dst.u.all == t->dst.u.all)); +-} +- +-/* look up the source key for a given tuple */ +-static u_int32_t gre_keymap_lookup(struct ip_conntrack_tuple *t) +-{ +- struct ip_ct_gre_keymap *km; +- u_int32_t key; +- +- READ_LOCK(&ip_ct_gre_lock); +- km = LIST_FIND(&gre_keymap_list, gre_key_cmpfn, +- struct ip_ct_gre_keymap *, t); +- if (!km) { +- READ_UNLOCK(&ip_ct_gre_lock); +- return 0; +- } +- +- key = km->tuple.src.u.gre.key; +- READ_UNLOCK(&ip_ct_gre_lock); +- +- return key; +-} +- +-/* add a single keymap entry, associate with specified expect */ +-int ip_ct_gre_keymap_add(struct ip_conntrack_expect *exp, +- struct ip_conntrack_tuple *t, int reply) +-{ +- struct ip_ct_gre_keymap *km; +- +- km = kmalloc(sizeof(*km), GFP_ATOMIC); +- if (!km) +- return -1; +- +- /* initializing list head should be sufficient */ +- memset(km, 0, sizeof(*km)); +- +- memcpy(&km->tuple, t, sizeof(*t)); +- km->master = exp; +- +- if (!reply) +- exp->proto.gre.keymap_orig = km; +- else +- exp->proto.gre.keymap_reply = km; +- +- DEBUGP("adding new entry %p: ", km); +- DUMP_TUPLE_GRE(&km->tuple); +- +- WRITE_LOCK(&ip_ct_gre_lock); +- list_append(&gre_keymap_list, km); +- WRITE_UNLOCK(&ip_ct_gre_lock); +- +- return 0; +-} +- +-/* change the tuple of a keymap entry (used by nat helper) */ +-void ip_ct_gre_keymap_change(struct ip_ct_gre_keymap *km, +- struct ip_conntrack_tuple *t) +-{ +- DEBUGP("changing entry %p to: ", km); +- DUMP_TUPLE_GRE(t); +- +- WRITE_LOCK(&ip_ct_gre_lock); +- memcpy(&km->tuple, t, sizeof(km->tuple)); +- WRITE_UNLOCK(&ip_ct_gre_lock); +-} +- +- +-/* PUBLIC CONNTRACK PROTO HELPER FUNCTIONS */ +- +-/* invert gre part of tuple */ +-static int gre_invert_tuple(struct ip_conntrack_tuple *tuple, +- const struct ip_conntrack_tuple *orig) +-{ +- tuple->dst.u.gre.protocol = orig->dst.u.gre.protocol; +- tuple->dst.u.gre.version = orig->dst.u.gre.version; +- +- tuple->dst.u.gre.key = orig->src.u.gre.key; +- tuple->src.u.gre.key = orig->dst.u.gre.key; +- +- return 1; +-} +- +-/* gre hdr info to tuple */ +-static int gre_pkt_to_tuple(const void *datah, size_t datalen, +- struct ip_conntrack_tuple *tuple) +-{ +- struct gre_hdr *grehdr = (struct gre_hdr *) datah; +- struct gre_hdr_pptp *pgrehdr = (struct gre_hdr_pptp *) datah; +- u_int32_t srckey; +- +- /* core guarantees 8 protocol bytes, no need for size check */ +- +- tuple->dst.u.gre.version = grehdr->version; +- tuple->dst.u.gre.protocol = grehdr->protocol; +- +- switch (grehdr->version) { +- case GRE_VERSION_1701: +- if (!grehdr->key) { +- DEBUGP("Can't track GRE without key\n"); +- return 0; +- } +- tuple->dst.u.gre.key = *(gre_key(grehdr)); +- break; +- +- case GRE_VERSION_PPTP: +- if (ntohs(grehdr->protocol) != GRE_PROTOCOL_PPTP) { +- DEBUGP("GRE_VERSION_PPTP but unknown proto\n"); +- return 0; +- } +- tuple->dst.u.gre.key = htonl(ntohs(pgrehdr->call_id)); +- break; +- +- default: +- printk(KERN_WARNING "unknown GRE version %hu\n", +- tuple->dst.u.gre.version); +- return 0; +- } +- +- srckey = gre_keymap_lookup(tuple); +- +- tuple->src.u.gre.key = srckey; +- +- return 1; +-} +- +-/* print gre part of tuple */ +-static unsigned int gre_print_tuple(char *buffer, +- const struct ip_conntrack_tuple *tuple) +-{ +- return sprintf(buffer, "version=%d protocol=0x%04x srckey=0x%x dstkey=0x%x ", +- tuple->dst.u.gre.version, +- ntohs(tuple->dst.u.gre.protocol), +- ntohl(tuple->src.u.gre.key), +- ntohl(tuple->dst.u.gre.key)); +-} +- +-/* print private data for conntrack */ +-static unsigned int gre_print_conntrack(char *buffer, +- const struct ip_conntrack *ct) +-{ +- return sprintf(buffer, "timeout=%u, stream_timeout=%u ", +- (ct->proto.gre.timeout / HZ), +- (ct->proto.gre.stream_timeout / HZ)); +-} +- +-/* Returns verdict for packet, and may modify conntrack */ +-static int gre_packet(struct ip_conntrack *ct, +- struct iphdr *iph, size_t len, +- enum ip_conntrack_info conntrackinfo) +-{ +- /* If we've seen traffic both ways, this is a GRE connection. +- * Extend timeout. */ +- if (ct->status & IPS_SEEN_REPLY) { +- ip_ct_refresh(ct, ct->proto.gre.stream_timeout); +- /* Also, more likely to be important, and not a probe. */ +- set_bit(IPS_ASSURED_BIT, &ct->status); +- } else +- ip_ct_refresh(ct, ct->proto.gre.timeout); +- +- return NF_ACCEPT; +-} +- +-/* Called when a new connection for this protocol found. */ +-static int gre_new(struct ip_conntrack *ct, +- struct iphdr *iph, size_t len) +-{ +- DEBUGP(": "); +- DUMP_TUPLE_GRE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- +- /* initialize to sane value. Ideally a conntrack helper +- * (e.g. in case of pptp) is increasing them */ +- ct->proto.gre.stream_timeout = GRE_STREAM_TIMEOUT; +- ct->proto.gre.timeout = GRE_TIMEOUT; +- +- return 1; +-} +- +-/* Called when a conntrack entry has already been removed from the hashes +- * and is about to be deleted from memory */ +-static void gre_destroy(struct ip_conntrack *ct) +-{ +- struct ip_conntrack_expect *master = ct->master; +- +- DEBUGP(" entering\n"); +- +- if (!master) { +- DEBUGP("no master exp for ct %p\n", ct); +- return; +- } +- +- WRITE_LOCK(&ip_ct_gre_lock); +- if (master->proto.gre.keymap_orig) { +- DEBUGP("removing %p from list\n", master->proto.gre.keymap_orig); +- list_del(&master->proto.gre.keymap_orig->list); +- kfree(master->proto.gre.keymap_orig); +- } +- if (master->proto.gre.keymap_reply) { +- DEBUGP("removing %p from list\n", master->proto.gre.keymap_reply); +- list_del(&master->proto.gre.keymap_reply->list); +- kfree(master->proto.gre.keymap_reply); +- } +- WRITE_UNLOCK(&ip_ct_gre_lock); +-} +- +-/* protocol helper struct */ +-static struct ip_conntrack_protocol gre = { { NULL, NULL }, IPPROTO_GRE, +- "gre", +- gre_pkt_to_tuple, +- gre_invert_tuple, +- gre_print_tuple, +- gre_print_conntrack, +- gre_packet, +- gre_new, +- gre_destroy, +- NULL, +- THIS_MODULE }; +- +-/* ip_conntrack_proto_gre initialization */ +-static int __init init(void) +-{ +- int retcode; +- +- if ((retcode = ip_conntrack_protocol_register(&gre))) { +- printk(KERN_ERR "Unable to register conntrack protocol " +- "helper for gre: %d\n", retcode); +- return -EIO; +- } +- +- return 0; +-} +- +-static void __exit fini(void) +-{ +- struct list_head *pos, *n; +- +- /* delete all keymap entries */ +- WRITE_LOCK(&ip_ct_gre_lock); +- list_for_each_safe(pos, n, &gre_keymap_list) { +- DEBUGP("deleting keymap %p\n", pos); +- list_del(pos); +- kfree(pos); +- } +- WRITE_UNLOCK(&ip_ct_gre_lock); +- +- ip_conntrack_protocol_unregister(&gre); +-} +- +-EXPORT_SYMBOL(ip_ct_gre_keymap_add); +-EXPORT_SYMBOL(ip_ct_gre_keymap_change); +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_proto_tcp.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_proto_tcp.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_proto_tcp.c 2003-08-12 07:33:45.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_proto_tcp.c 2004-05-09 04:13:03.000000000 -0400 +@@ -15,11 +15,17 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + /* Protects conntrack->proto.tcp */ + static DECLARE_RWLOCK(tcp_lock); + ++/* FIXME: Examine ipfilter's timeouts and conntrack transitions more ++ closely. They're more complex. --RR */ + + /* Actually, I believe that neither ipmasq (where this code is stolen + from) nor ipfilter do it exactly right. A new conntrack machine taking +@@ -39,6 +45,25 @@ + "LISTEN" + }; + ++#define SECS *HZ ++#define MINS * 60 SECS ++#define HOURS * 60 MINS ++#define DAYS * 24 HOURS ++ ++ ++static unsigned long tcp_timeouts[] ++= { 30 MINS, /* TCP_CONNTRACK_NONE, */ ++ 5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */ ++ 2 MINS, /* TCP_CONNTRACK_SYN_SENT, */ ++ 60 SECS, /* TCP_CONNTRACK_SYN_RECV, */ ++ 2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */ ++ 2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */ ++ 10 SECS, /* TCP_CONNTRACK_CLOSE, */ ++ 60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */ ++ 30 SECS, /* TCP_CONNTRACK_LAST_ACK, */ ++ 2 MINS, /* TCP_CONNTRACK_LISTEN, */ ++}; ++ + #define sNO TCP_CONNTRACK_NONE + #define sES TCP_CONNTRACK_ESTABLISHED + #define sSS TCP_CONNTRACK_SYN_SENT +@@ -161,13 +186,13 @@ + && tcph->syn && tcph->ack) + conntrack->proto.tcp.handshake_ack + = htonl(ntohl(tcph->seq) + 1); ++ WRITE_UNLOCK(&tcp_lock); + + /* If only reply is a RST, we can consider ourselves not to + have an established connection: this is a fairly common + problem case, so we can delete the conntrack + immediately. --RR */ + if (!(conntrack->status & IPS_SEEN_REPLY) && tcph->rst) { +- WRITE_UNLOCK(&tcp_lock); + if (del_timer(&conntrack->timeout)) + conntrack->timeout.function((unsigned long)conntrack); + } else { +@@ -178,9 +203,7 @@ + && tcph->ack_seq == conntrack->proto.tcp.handshake_ack) + set_bit(IPS_ASSURED_BIT, &conntrack->status); + +- WRITE_UNLOCK(&tcp_lock); +- ip_ct_refresh(conntrack, +- sysctl_ip_conntrack_tcp_timeouts[newconntrack]); ++ ip_ct_refresh(conntrack, tcp_timeouts[newconntrack]); + } + + return NF_ACCEPT; +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_proto_udp.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_proto_udp.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_proto_udp.c 2003-08-12 07:33:45.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_proto_udp.c 2004-05-09 04:13:03.000000000 -0400 +@@ -5,7 +5,9 @@ + #include + #include + #include +-#include ++ ++#define UDP_TIMEOUT (30*HZ) ++#define UDP_STREAM_TIMEOUT (180*HZ) + + static int udp_pkt_to_tuple(const void *datah, size_t datalen, + struct ip_conntrack_tuple *tuple) +@@ -50,13 +52,11 @@ + /* If we've seen traffic both ways, this is some kind of UDP + stream. Extend timeout. */ + if (conntrack->status & IPS_SEEN_REPLY) { +- ip_ct_refresh(conntrack, +- sysctl_ip_conntrack_udp_timeouts[UDP_STREAM_TIMEOUT]); ++ ip_ct_refresh(conntrack, UDP_STREAM_TIMEOUT); + /* Also, more likely to be important, and not a probe */ + set_bit(IPS_ASSURED_BIT, &conntrack->status); + } else +- ip_ct_refresh(conntrack, +- sysctl_ip_conntrack_udp_timeouts[UDP_TIMEOUT]); ++ ip_ct_refresh(conntrack, UDP_TIMEOUT); + + return NF_ACCEPT; + } +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_standalone.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_standalone.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_standalone.c 2003-08-12 07:33:45.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_standalone.c 2004-05-09 04:13:03.000000000 -0400 +@@ -27,7 +27,11 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + struct module *ip_conntrack_module = THIS_MODULE; + MODULE_LICENSE("GPL"); +@@ -52,17 +56,12 @@ + return len; + } + ++/* FIXME: Don't print source proto part. --RR */ + static unsigned int + print_expect(char *buffer, const struct ip_conntrack_expect *expect) + { + unsigned int len; + +- if (!expect || !expect->expectant || !expect->expectant->helper) { +- DEBUGP("expect %x expect->expectant %x expect->expectant->helper %x\n", +- expect, expect->expectant, expect->expectant->helper); +- return 0; +- } +- + if (expect->expectant->helper->timeout) + len = sprintf(buffer, "EXPECTING: %lu ", + timer_pending(&expect->timeout) +@@ -294,6 +293,8 @@ + return ret; + } + ++/* FIXME: Allow NULL functions and sub in pointers to generic for ++ them. --RR */ + int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto) + { + int ret = 0; +@@ -362,8 +363,6 @@ + EXPORT_SYMBOL(ip_ct_find_proto); + EXPORT_SYMBOL(__ip_ct_find_proto); + EXPORT_SYMBOL(ip_ct_find_helper); +-EXPORT_SYMBOL(sysctl_ip_conntrack_tcp_timeouts); +-EXPORT_SYMBOL(sysctl_ip_conntrack_udp_timeouts); + EXPORT_SYMBOL(ip_conntrack_expect_related); + EXPORT_SYMBOL(ip_conntrack_change_expect); + EXPORT_SYMBOL(ip_conntrack_unexpect_related); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_conntrack_tftp.c src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_tftp.c +--- src/linux/linux/net/ipv4/netfilter/ip_conntrack_tftp.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_conntrack_tftp.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,126 +0,0 @@ +-/* +- * Licensed under GNU GPL version 2 Copyright Magnus Boden +- * Version: 0.0.7 +- * +- * Thu 21 Mar 2002 Harald Welte +- * - port to newnat API +- * +- */ +- +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +- +-MODULE_AUTHOR("Magnus Boden "); +-MODULE_DESCRIPTION("Netfilter connection tracking module for tftp"); +-MODULE_LICENSE("GPL"); +- +-#define MAX_PORTS 8 +-static int ports[MAX_PORTS]; +-static int ports_c = 0; +-#ifdef MODULE_PARM +-MODULE_PARM(ports, "1-" __MODULE_STRING(MAX_PORTS) "i"); +-MODULE_PARM_DESC(ports, "port numbers of tftp servers"); +-#endif +- +-#define DEBUGP(format, args...) +- +-static int tftp_help(const struct iphdr *iph, size_t len, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo) +-{ +- struct udphdr *udph = (void *)iph + iph->ihl * 4; +- struct tftphdr *tftph = (void *)udph + 8; +- struct ip_conntrack_expect exp; +- +- switch (ntohs(tftph->opcode)) { +- /* RRQ and WRQ works the same way */ +- case TFTP_OPCODE_READ: +- case TFTP_OPCODE_WRITE: +- DEBUGP(""); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); +- memset(&exp, 0, sizeof(exp)); +- +- exp.tuple = ct->tuplehash[IP_CT_DIR_REPLY].tuple; +- exp.mask.src.ip = 0xffffffff; +- exp.mask.dst.ip = 0xffffffff; +- exp.mask.dst.u.udp.port = 0xffff; +- exp.mask.dst.protonum = 0xffff; +- exp.expectfn = NULL; +- +- DEBUGP("expect: "); +- DUMP_TUPLE(&exp.tuple); +- DUMP_TUPLE(&exp.mask); +- ip_conntrack_expect_related(ct, &exp); +- break; +- default: +- DEBUGP("Unknown opcode\n"); +- } +- return NF_ACCEPT; +-} +- +-static struct ip_conntrack_helper tftp[MAX_PORTS]; +-static char tftp_names[MAX_PORTS][10]; +- +-static void fini(void) +-{ +- int i; +- +- for (i = 0 ; i < ports_c; i++) { +- DEBUGP("unregistering helper for port %d\n", +- ports[i]); +- ip_conntrack_helper_unregister(&tftp[i]); +- } +-} +- +-static int __init init(void) +-{ +- int i, ret; +- char *tmpname; +- +- if (!ports[0]) +- ports[0]=TFTP_PORT; +- +- for (i = 0 ; (i < MAX_PORTS) && ports[i] ; i++) { +- /* Create helper structure */ +- memset(&tftp[i], 0, sizeof(struct ip_conntrack_helper)); +- +- tftp[i].tuple.dst.protonum = IPPROTO_UDP; +- tftp[i].tuple.src.u.udp.port = htons(ports[i]); +- tftp[i].mask.dst.protonum = 0xFFFF; +- tftp[i].mask.src.u.udp.port = 0xFFFF; +- tftp[i].max_expected = 1; +- tftp[i].timeout = 0; +- tftp[i].flags = IP_CT_HELPER_F_REUSE_EXPECT; +- tftp[i].me = THIS_MODULE; +- tftp[i].help = tftp_help; +- +- tmpname = &tftp_names[i][0]; +- if (ports[i] == TFTP_PORT) +- sprintf(tmpname, "tftp"); +- else +- sprintf(tmpname, "tftp-%d", i); +- tftp[i].name = tmpname; +- +- DEBUGP("port #%d: %d\n", i, ports[i]); +- +- ret=ip_conntrack_helper_register(&tftp[i]); +- if (ret) { +- printk("ERROR registering helper for port %d\n", +- ports[i]); +- fini(); +- return(ret); +- } +- ports_c++; +- } +- return(0); +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_core.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_core.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_core.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_core.c 2004-05-09 04:13:03.000000000 -0400 +@@ -31,7 +31,11 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + DECLARE_RWLOCK(ip_nat_lock); + DECLARE_RWLOCK_EXTERN(ip_conntrack_lock); +@@ -207,6 +211,7 @@ + { + struct rtable *rt; + ++ /* FIXME: IPTOS_TOS(iph->tos) --RR */ + if (ip_route_output(&rt, var_ip, 0, 0, 0) != 0) { + DEBUGP("do_extra_mangle: Can't get route to %u.%u.%u.%u\n", + NIPQUAD(var_ip)); +@@ -429,7 +434,7 @@ + *tuple = *orig_tuple; + while ((rptr = find_best_ips_proto_fast(tuple, mr, conntrack, hooknum)) + != NULL) { +- DEBUGP("Found best for "); DUMP_TUPLE_RAW(tuple); ++ DEBUGP("Found best for "); DUMP_TUPLE(tuple); + /* 3) The per-protocol part of the manip is made to + map into the range to make a unique tuple. */ + +@@ -529,6 +534,31 @@ + invert_tuplepr(&orig_tp, + &conntrack->tuplehash[IP_CT_DIR_REPLY].tuple); + ++#if 0 ++ { ++ unsigned int i; ++ ++ DEBUGP("Hook %u (%s), ", hooknum, ++ HOOK2MANIP(hooknum)==IP_NAT_MANIP_SRC ? "SRC" : "DST"); ++ DUMP_TUPLE(&orig_tp); ++ DEBUGP("Range %p: ", mr); ++ for (i = 0; i < mr->rangesize; i++) { ++ DEBUGP("%u:%s%s%s %u.%u.%u.%u - %u.%u.%u.%u %u - %u\n", ++ i, ++ (mr->range[i].flags & IP_NAT_RANGE_MAP_IPS) ++ ? " MAP_IPS" : "", ++ (mr->range[i].flags ++ & IP_NAT_RANGE_PROTO_SPECIFIED) ++ ? " PROTO_SPECIFIED" : "", ++ (mr->range[i].flags & IP_NAT_RANGE_FULL) ++ ? " FULL" : "", ++ NIPQUAD(mr->range[i].min_ip), ++ NIPQUAD(mr->range[i].max_ip), ++ mr->range[i].min.all, ++ mr->range[i].max.all); ++ } ++ } ++#endif + + do { + if (!get_unique_tuple(&new_tuple, &orig_tp, mr, conntrack, +@@ -538,6 +568,15 @@ + return NF_DROP; + } + ++#if 0 ++ DEBUGP("Hook %u (%s) %p\n", hooknum, ++ HOOK2MANIP(hooknum)==IP_NAT_MANIP_SRC ? "SRC" : "DST", ++ conntrack); ++ DEBUGP("Original: "); ++ DUMP_TUPLE(&orig_tp); ++ DEBUGP("New: "); ++ DUMP_TUPLE(&new_tuple); ++#endif + + /* We now have two tuples (SRCIP/SRCPT/DSTIP/DSTPT): + the original (A/B/C/D') and the mangled one (E/F/G/H'). +@@ -554,6 +593,8 @@ + If fail this race (reply tuple now used), repeat. */ + } while (!ip_conntrack_alter_reply(conntrack, &reply)); + ++ /* FIXME: We can simply used existing conntrack reply tuple ++ here --RR */ + /* Create inverse of original: C/D/A/B' */ + invert_tuplepr(&inv_tuple, &orig_tp); + +@@ -678,6 +719,17 @@ + iph->check); + iph->daddr = manip->ip; + } ++#if 0 ++ if (ip_fast_csum((u8 *)iph, iph->ihl) != 0) ++ DEBUGP("IP: checksum on packet bad.\n"); ++ ++ if (proto == IPPROTO_TCP) { ++ void *th = (u_int32_t *)iph + iph->ihl; ++ if (tcp_v4_check(th, len - 4*iph->ihl, iph->saddr, iph->daddr, ++ csum_partial((char *)th, len-4*iph->ihl, 0))) ++ DEBUGP("TCP: checksum on packet bad\n"); ++ } ++#endif + } + + static inline int exp_for_packet(struct ip_conntrack_expect *exp, +@@ -765,6 +817,7 @@ + continue; + + if (exp_for_packet(exp, pskb)) { ++ /* FIXME: May be true multiple times in the case of UDP!! */ + DEBUGP("calling nat helper (exp=%p) for packet\n", + exp); + ret = helper->help(ct, exp, info, ctinfo, +@@ -926,6 +979,7 @@ + INIT_LIST_HEAD(&byipsproto[i]); + } + ++ /* FIXME: Man, this is a hack. */ + IP_NF_ASSERT(ip_conntrack_destroyed == NULL); + ip_conntrack_destroyed = &ip_nat_cleanup_conntrack; + +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_h323.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_h323.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_h323.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_h323.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,403 +0,0 @@ +-/* +- * H.323 'brute force' extension for NAT alteration. +- * Jozsef Kadlecsik +- * +- * Based on ip_masq_h323.c for 2.2 kernels from CoRiTel, Sofia project. +- * (http://www.coritel.it/projects/sofia/nat.html) +- * Uses Sampsa Ranta's excellent idea on using expectfn to 'bind' +- * the unregistered helpers to the conntrack entries. +- */ +- +- +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-MODULE_AUTHOR("Jozsef Kadlecsik "); +-MODULE_DESCRIPTION("H.323 'brute force' connection tracking module"); +-MODULE_LICENSE("GPL"); +- +-DECLARE_LOCK_EXTERN(ip_h323_lock); +-struct module *ip_nat_h323 = THIS_MODULE; +- +-#define DEBUGP(format, args...) +- +- +-static unsigned int +-h225_nat_expected(struct sk_buff **pskb, +- unsigned int hooknum, +- struct ip_conntrack *ct, +- struct ip_nat_info *info); +- +-static unsigned int h225_nat_help(struct ip_conntrack *ct, +- struct ip_conntrack_expect *exp, +- struct ip_nat_info *info, +- enum ip_conntrack_info ctinfo, +- unsigned int hooknum, +- struct sk_buff **pskb); +- +-static struct ip_nat_helper h245 = +- { { NULL, NULL }, +- "H.245", /* name */ +- 0, /* flags */ +- NULL, /* module */ +- { { 0, { 0 } }, /* tuple */ +- { 0, { 0 }, IPPROTO_TCP } }, +- { { 0, { 0xFFFF } }, /* mask */ +- { 0, { 0 }, 0xFFFF } }, +- h225_nat_help, /* helper */ +- h225_nat_expected /* expectfn */ +- }; +- +-static unsigned int +-h225_nat_expected(struct sk_buff **pskb, +- unsigned int hooknum, +- struct ip_conntrack *ct, +- struct ip_nat_info *info) +-{ +- struct ip_nat_multi_range mr; +- u_int32_t newdstip, newsrcip, newip; +- u_int16_t port; +- struct ip_ct_h225_expect *exp_info; +- struct ip_ct_h225_master *master_info; +- struct ip_conntrack *master = master_ct(ct); +- unsigned int is_h225, ret; +- +- IP_NF_ASSERT(info); +- IP_NF_ASSERT(master); +- +- IP_NF_ASSERT(!(info->initialized & (1<master->expectant->help.ct_h225_info; +- exp_info = &ct->master->help.exp_h225_info; +- +- LOCK_BH(&ip_h323_lock); +- +- DEBUGP("master: "); +- DUMP_TUPLE(&master->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- DUMP_TUPLE(&master->tuplehash[IP_CT_DIR_REPLY].tuple); +- DEBUGP("conntrack: "); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- if (exp_info->dir == IP_CT_DIR_ORIGINAL) { +- /* Make connection go to the client. */ +- newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip; +- newsrcip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip; +- DEBUGP("h225_nat_expected: %u.%u.%u.%u->%u.%u.%u.%u (to client)\n", +- NIPQUAD(newsrcip), NIPQUAD(newdstip)); +- } else { +- /* Make the connection go to the server */ +- newdstip = master->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip; +- newsrcip = master->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- DEBUGP("h225_nat_expected: %u.%u.%u.%u->%u.%u.%u.%u (to server)\n", +- NIPQUAD(newsrcip), NIPQUAD(newdstip)); +- } +- port = exp_info->port; +- is_h225 = master_info->is_h225 == H225_PORT; +- UNLOCK_BH(&ip_h323_lock); +- +- if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) +- newip = newsrcip; +- else +- newip = newdstip; +- +- DEBUGP("h225_nat_expected: IP to %u.%u.%u.%u\n", NIPQUAD(newip)); +- +- mr.rangesize = 1; +- /* We don't want to manip the per-protocol, just the IPs... */ +- mr.range[0].flags = IP_NAT_RANGE_MAP_IPS; +- mr.range[0].min_ip = mr.range[0].max_ip = newip; +- +- /* ... unless we're doing a MANIP_DST, in which case, make +- sure we map to the correct port */ +- if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_DST) { +- mr.range[0].flags |= IP_NAT_RANGE_PROTO_SPECIFIED; +- mr.range[0].min = mr.range[0].max +- = ((union ip_conntrack_manip_proto) +- { port }); +- } +- +- ret = ip_nat_setup_info(ct, &mr, hooknum); +- +- if (is_h225) { +- DEBUGP("h225_nat_expected: H.225, setting NAT helper for %p\n", ct); +- /* NAT expectfn called with ip_nat_lock write-locked */ +- info->helper = &h245; +- } +- return ret; +-} +- +-static int h323_signal_address_fixup(struct ip_conntrack *ct, +- struct sk_buff **pskb, +- enum ip_conntrack_info ctinfo) +-{ +- struct iphdr *iph = (*pskb)->nh.iph; +- struct tcphdr *tcph = (void *)iph + iph->ihl*4; +- unsigned char *data; +- u_int32_t tcplen = (*pskb)->len - iph->ihl*4; +- u_int32_t datalen = tcplen - tcph->doff*4; +- struct ip_ct_h225_master *info = &ct->help.ct_h225_info; +- u_int32_t newip; +- u_int16_t port; +- u_int8_t buffer[6]; +- int i; +- +- MUST_BE_LOCKED(&ip_h323_lock); +- +- DEBUGP("h323_signal_address_fixup: %s %s\n", +- between(info->seq[IP_CT_DIR_ORIGINAL], ntohl(tcph->seq), ntohl(tcph->seq) + datalen) +- ? "yes" : "no", +- between(info->seq[IP_CT_DIR_REPLY], ntohl(tcph->seq), ntohl(tcph->seq) + datalen) +- ? "yes" : "no"); +- if (!(between(info->seq[IP_CT_DIR_ORIGINAL], ntohl(tcph->seq), ntohl(tcph->seq) + datalen) +- || between(info->seq[IP_CT_DIR_REPLY], ntohl(tcph->seq), ntohl(tcph->seq) + datalen))) +- return 1; +- +- DEBUGP("h323_signal_address_fixup: offsets %u + 6 and %u + 6 in %u\n", +- info->offset[IP_CT_DIR_ORIGINAL], +- info->offset[IP_CT_DIR_REPLY], +- tcplen); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); +- +- for (i = 0; i < IP_CT_DIR_MAX; i++) { +- DEBUGP("h323_signal_address_fixup: %s %s\n", +- info->dir == IP_CT_DIR_ORIGINAL ? "original" : "reply", +- i == IP_CT_DIR_ORIGINAL ? "caller" : "callee"); +- if (!between(info->seq[i], ntohl(tcph->seq), +- ntohl(tcph->seq) + datalen)) +- continue; +- if (!between(info->seq[i] + 6, ntohl(tcph->seq), +- ntohl(tcph->seq) + datalen)) { +- /* Partial retransmisison. It's a cracker being funky. */ +- if (net_ratelimit()) { +- printk("H.323_NAT: partial packet %u/6 in %u/%u\n", +- info->seq[i], +- ntohl(tcph->seq), +- ntohl(tcph->seq) + datalen); +- } +- return 0; +- } +- +- /* Change address inside packet to match way we're mapping +- this connection. */ +- if (i == IP_CT_DIR_ORIGINAL) { +- newip = ct->tuplehash[!info->dir].tuple.dst.ip; +- port = ct->tuplehash[!info->dir].tuple.dst.u.tcp.port; +- } else { +- newip = ct->tuplehash[!info->dir].tuple.src.ip; +- port = ct->tuplehash[!info->dir].tuple.src.u.tcp.port; +- } +- +- data = (char *) tcph + tcph->doff * 4 + info->offset[i]; +- +- DEBUGP("h323_signal_address_fixup: orig %s IP:port %u.%u.%u.%u:%u\n", +- i == IP_CT_DIR_ORIGINAL ? "source" : "dest ", +- data[0], data[1], data[2], data[3], +- (data[4] << 8 | data[5])); +- +- /* Modify the packet */ +- memcpy(buffer, &newip, 4); +- memcpy(buffer + 4, &port, 2); +- if (!ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, info->offset[i], +- 6, buffer, 6)) +- return 0; +- +- DEBUGP("h323_signal_address_fixup: new %s IP:port %u.%u.%u.%u:%u\n", +- i == IP_CT_DIR_ORIGINAL ? "source" : "dest ", +- data[0], data[1], data[2], data[3], +- (data[4] << 8 | data[5])); +- } +- +- return 1; +-} +- +-static int h323_data_fixup(struct ip_ct_h225_expect *info, +- struct ip_conntrack *ct, +- struct sk_buff **pskb, +- enum ip_conntrack_info ctinfo, +- struct ip_conntrack_expect *expect) +-{ +- u_int32_t newip; +- u_int16_t port; +- u_int8_t buffer[6]; +- struct ip_conntrack_tuple newtuple; +- struct iphdr *iph = (*pskb)->nh.iph; +- struct tcphdr *tcph = (void *)iph + iph->ihl*4; +- unsigned char *data; +- u_int32_t tcplen = (*pskb)->len - iph->ihl*4; +- struct ip_ct_h225_master *master_info = &ct->help.ct_h225_info; +- int is_h225; +- +- MUST_BE_LOCKED(&ip_h323_lock); +- DEBUGP("h323_data_fixup: offset %u + 6 in %u\n", info->offset, tcplen); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); +- +- if (!between(expect->seq + 6, ntohl(tcph->seq), +- ntohl(tcph->seq) + tcplen - tcph->doff * 4)) { +- /* Partial retransmisison. It's a cracker being funky. */ +- if (net_ratelimit()) { +- printk("H.323_NAT: partial packet %u/6 in %u/%u\n", +- expect->seq, +- ntohl(tcph->seq), +- ntohl(tcph->seq) + tcplen - tcph->doff * 4); +- } +- return 0; +- } +- +- /* Change address inside packet to match way we're mapping +- this connection. */ +- if (info->dir == IP_CT_DIR_REPLY) { +- /* Must be where client thinks server is */ +- newip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip; +- /* Expect something from client->server */ +- newtuple.src.ip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip; +- newtuple.dst.ip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip; +- } else { +- /* Must be where server thinks client is */ +- newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- /* Expect something from server->client */ +- newtuple.src.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip; +- newtuple.dst.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- } +- +- is_h225 = (master_info->is_h225 == H225_PORT); +- +- if (is_h225) { +- newtuple.dst.protonum = IPPROTO_TCP; +- newtuple.src.u.tcp.port = expect->tuple.src.u.tcp.port; +- } else { +- newtuple.dst.protonum = IPPROTO_UDP; +- newtuple.src.u.udp.port = expect->tuple.src.u.udp.port; +- } +- +- /* Try to get same port: if not, try to change it. */ +- for (port = ntohs(info->port); port != 0; port++) { +- if (is_h225) +- newtuple.dst.u.tcp.port = htons(port); +- else +- newtuple.dst.u.udp.port = htons(port); +- +- if (ip_conntrack_change_expect(expect, &newtuple) == 0) +- break; +- } +- if (port == 0) { +- DEBUGP("h323_data_fixup: no free port found!\n"); +- return 0; +- } +- +- port = htons(port); +- +- data = (char *) tcph + tcph->doff * 4 + info->offset; +- +- DEBUGP("h323_data_fixup: orig IP:port %u.%u.%u.%u:%u\n", +- data[0], data[1], data[2], data[3], +- (data[4] << 8 | data[5])); +- +- /* Modify the packet */ +- memcpy(buffer, &newip, 4); +- memcpy(buffer + 4, &port, 2); +- if (!ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, info->offset, +- 6, buffer, 6)) +- return 0; +- +- DEBUGP("h323_data_fixup: new IP:port %u.%u.%u.%u:%u\n", +- data[0], data[1], data[2], data[3], +- (data[4] << 8 | data[5])); +- +- return 1; +-} +- +-static unsigned int h225_nat_help(struct ip_conntrack *ct, +- struct ip_conntrack_expect *exp, +- struct ip_nat_info *info, +- enum ip_conntrack_info ctinfo, +- unsigned int hooknum, +- struct sk_buff **pskb) +-{ +- int dir; +- struct ip_ct_h225_expect *exp_info; +- +- /* Only mangle things once: original direction in POST_ROUTING +- and reply direction on PRE_ROUTING. */ +- dir = CTINFO2DIR(ctinfo); +- DEBUGP("nat_h323: dir %s at hook %s\n", +- dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY", +- hooknum == NF_IP_POST_ROUTING ? "POSTROUTING" +- : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING" +- : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???"); +- if (!((hooknum == NF_IP_POST_ROUTING && dir == IP_CT_DIR_ORIGINAL) +- || (hooknum == NF_IP_PRE_ROUTING && dir == IP_CT_DIR_REPLY))) { +- DEBUGP("nat_h323: Not touching dir %s at hook %s\n", +- dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY", +- hooknum == NF_IP_POST_ROUTING ? "POSTROUTING" +- : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING" +- : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???"); +- return NF_ACCEPT; +- } +- +- if (!exp) { +- LOCK_BH(&ip_h323_lock); +- if (!h323_signal_address_fixup(ct, pskb, ctinfo)) { +- UNLOCK_BH(&ip_h323_lock); +- return NF_DROP; +- } +- UNLOCK_BH(&ip_h323_lock); +- return NF_ACCEPT; +- } +- +- exp_info = &exp->help.exp_h225_info; +- +- LOCK_BH(&ip_h323_lock); +- if (!h323_data_fixup(exp_info, ct, pskb, ctinfo, exp)) { +- UNLOCK_BH(&ip_h323_lock); +- return NF_DROP; +- } +- UNLOCK_BH(&ip_h323_lock); +- +- return NF_ACCEPT; +-} +- +-static struct ip_nat_helper h225 = +- { { NULL, NULL }, +- "H.225", /* name */ +- IP_NAT_HELPER_F_ALWAYS, /* flags */ +- THIS_MODULE, /* module */ +- { { 0, { __constant_htons(H225_PORT) } }, /* tuple */ +- { 0, { 0 }, IPPROTO_TCP } }, +- { { 0, { 0xFFFF } }, /* mask */ +- { 0, { 0 }, 0xFFFF } }, +- h225_nat_help, /* helper */ +- h225_nat_expected /* expectfn */ +- }; +- +-static int __init init(void) +-{ +- int ret; +- +- ret = ip_nat_helper_register(&h225); +- +- if (ret != 0) +- printk("ip_nat_h323: cannot initialize the module!\n"); +- +- return ret; +-} +- +-static void __exit fini(void) +-{ +- ip_nat_helper_unregister(&h225); +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_helper.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_helper.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_helper.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_helper.c 2004-05-09 04:13:03.000000000 -0400 +@@ -8,9 +8,6 @@ + * - add support for SACK adjustment + * 14 Mar 2002 Harald Welte : + * - merge SACK support into newnat API +- * 16 Aug 2002 Brian J. Murrell : +- * - make ip_nat_resize_packet more generic (TCP and UDP) +- * - add ip_nat_mangle_udp_packet + */ + #include + #include +@@ -25,7 +22,6 @@ + #include + #include + #include +-#include + + #define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_nat_lock) + #define ASSERT_WRITE_LOCK(x) MUST_BE_WRITE_LOCKED(&ip_nat_lock) +@@ -38,8 +34,13 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#define DUMP_OFFSET(x) printk("offset_before=%d, offset_after=%d, correction_pos=%u\n", x->offset_before, x->offset_after, x->correction_pos); ++#else + #define DEBUGP(format, args...) + #define DUMP_OFFSET(x) ++#endif + + DECLARE_LOCK(ip_nat_seqofs_lock); + +@@ -50,12 +51,18 @@ + int new_size) + { + struct iphdr *iph; ++ struct tcphdr *tcph; ++ void *data; + int dir; + struct ip_nat_seq *this_way, *other_way; + + DEBUGP("ip_nat_resize_packet: old_size = %u, new_size = %u\n", + (*skb)->len, new_size); + ++ iph = (*skb)->nh.iph; ++ tcph = (void *)iph + iph->ihl*4; ++ data = (void *)tcph + tcph->doff*4; ++ + dir = CTINFO2DIR(ctinfo); + + this_way = &ct->nat.info.seq[dir]; +@@ -77,9 +84,8 @@ + } + + iph = (*skb)->nh.iph; +- if (iph->protocol == IPPROTO_TCP) { +- struct tcphdr *tcph = (void *)iph + iph->ihl*4; +- void *data = (void *)tcph + tcph->doff*4; ++ tcph = (void *)iph + iph->ihl*4; ++ data = (void *)tcph + tcph->doff*4; + + DEBUGP("ip_nat_resize_packet: Seq_offset before: "); + DUMP_OFFSET(this_way); +@@ -95,20 +101,25 @@ + this_way->correction_pos = ntohl(tcph->seq); + this_way->offset_before = this_way->offset_after; + this_way->offset_after = (int32_t) +- this_way->offset_before + new_size - +- (*skb)->len; ++ this_way->offset_before + new_size - (*skb)->len; + } + + UNLOCK_BH(&ip_nat_seqofs_lock); + + DEBUGP("ip_nat_resize_packet: Seq_offset after: "); + DUMP_OFFSET(this_way); +- } + + return 1; + } + + ++/* Generic function for mangling variable-length address changes inside ++ * NATed connections (like the PORT XXX,XXX,XXX,XXX,XXX,XXX command in FTP). ++ * ++ * Takes care about all the nasty sequence number changes, checksumming, ++ * skb enlargement, ... ++ * ++ * */ + int + ip_nat_mangle_tcp_packet(struct sk_buff **skb, + struct ip_conntrack *ct, +@@ -163,7 +174,6 @@ + tcph = (void *)iph + iph->ihl*4; + data = (void *)tcph + tcph->doff*4; + +- if (rep_len != match_len) + /* move post-replacement */ + memmove(data + match_offset + rep_len, + data + match_offset + match_len, +@@ -198,104 +208,6 @@ + return 1; + } + +-int +-ip_nat_mangle_udp_packet(struct sk_buff **skb, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo, +- unsigned int match_offset, +- unsigned int match_len, +- char *rep_buffer, +- unsigned int rep_len) +-{ +- struct iphdr *iph = (*skb)->nh.iph; +- struct udphdr *udph = (void *)iph + iph->ihl * 4; +- unsigned char *data; +- u_int32_t udplen, newlen, newudplen; +- +- udplen = (*skb)->len - iph->ihl*4; +- newudplen = udplen - match_len + rep_len; +- newlen = iph->ihl*4 + newudplen; +- +- if (newlen > 65535) { +- if (net_ratelimit()) +- printk("ip_nat_mangle_udp_packet: nat'ed packet " +- "exceeds maximum packet size\n"); +- return 0; +- } +- +- if ((*skb)->len != newlen) { +- if (!ip_nat_resize_packet(skb, ct, ctinfo, newlen)) { +- printk("resize_packet failed!!\n"); +- return 0; +- } +- } +- +- /* Alexey says: if a hook changes _data_ ... it can break +- original packet sitting in tcp queue and this is fatal */ +- if (skb_cloned(*skb)) { +- struct sk_buff *nskb = skb_copy(*skb, GFP_ATOMIC); +- if (!nskb) { +- if (net_ratelimit()) +- printk("Out of memory cloning TCP packet\n"); +- return 0; +- } +- /* Rest of kernel will get very unhappy if we pass it +- a suddenly-orphaned skbuff */ +- if ((*skb)->sk) +- skb_set_owner_w(nskb, (*skb)->sk); +- kfree_skb(*skb); +- *skb = nskb; +- } +- +- /* skb may be copied !! */ +- iph = (*skb)->nh.iph; +- udph = (void *)iph + iph->ihl*4; +- data = (void *)udph + sizeof(struct udphdr); +- +- if (rep_len != match_len) +- /* move post-replacement */ +- memmove(data + match_offset + rep_len, +- data + match_offset + match_len, +- (*skb)->tail - (data + match_offset + match_len)); +- +- /* insert data from buffer */ +- memcpy(data + match_offset, rep_buffer, rep_len); +- +- /* update skb info */ +- if (newlen > (*skb)->len) { +- DEBUGP("ip_nat_mangle_udp_packet: Extending packet by " +- "%u to %u bytes\n", newlen - (*skb)->len, newlen); +- skb_put(*skb, newlen - (*skb)->len); +- } else { +- DEBUGP("ip_nat_mangle_udp_packet: Shrinking packet from " +- "%u to %u bytes\n", (*skb)->len, newlen); +- skb_trim(*skb, newlen); +- } +- +- /* update the length of the UDP and IP packets to the new values*/ +- udph->len = htons((*skb)->len - iph->ihl*4); +- iph->tot_len = htons(newlen); +- +- /* fix udp checksum if udp checksum was previously calculated */ +- if ((*skb)->csum != 0) { +- (*skb)->csum = csum_partial((char *)udph + +- sizeof(struct udphdr), +- newudplen - sizeof(struct udphdr), +- 0); +- +- udph->check = 0; +- udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, +- newudplen, IPPROTO_UDP, +- csum_partial((char *)udph, +- sizeof(struct udphdr), +- (*skb)->csum)); +- } +- +- ip_send_check(iph); +- +- return 1; +-} +- + /* Adjust one found SACK option including checksum correction */ + static void + sack_adjust(struct tcphdr *tcph, +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_mms.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_mms.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_mms.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_mms.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,330 +0,0 @@ +-/* MMS extension for TCP NAT alteration. +- * (C) 2002 by Filip Sneppe +- * based on ip_nat_ftp.c and ip_nat_irc.c +- * +- * ip_nat_mms.c v0.3 2002-09-22 +- * +- * 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. +- * +- * Module load syntax: +- * insmod ip_nat_mms.o ports=port1,port2,...port +- * +- * Please give the ports of all MMS servers You wish to connect to. +- * If you don't specify ports, the default will be TCP port 1755. +- * +- * More info on MMS protocol, firewalls and NAT: +- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/MMSFirewall.asp +- * http://www.microsoft.com/windows/windowsmedia/serve/firewall.asp +- * +- * The SDP project people are reverse-engineering MMS: +- * http://get.to/sdp +- */ +- +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define DEBUGP(format, args...) +-#define DUMP_BYTES(address, counter) +- +-#define MAX_PORTS 8 +-static int ports[MAX_PORTS]; +-static int ports_c = 0; +- +-#ifdef MODULE_PARM +-MODULE_PARM(ports, "1-" __MODULE_STRING(MAX_PORTS) "i"); +-#endif +- +-MODULE_AUTHOR("Filip Sneppe "); +-MODULE_DESCRIPTION("Microsoft Windows Media Services (MMS) NAT module"); +-MODULE_LICENSE("GPL"); +- +-DECLARE_LOCK_EXTERN(ip_mms_lock); +- +- +-static int mms_data_fixup(const struct ip_ct_mms_expect *ct_mms_info, +- struct ip_conntrack *ct, +- struct sk_buff **pskb, +- enum ip_conntrack_info ctinfo, +- struct ip_conntrack_expect *expect) +-{ +- u_int32_t newip; +- struct ip_conntrack_tuple t; +- struct iphdr *iph = (*pskb)->nh.iph; +- struct tcphdr *tcph = (void *) iph + iph->ihl * 4; +- char *data = (char *)tcph + tcph->doff * 4; +- int i, j, k, port; +- u_int16_t mms_proto; +- +- u_int32_t *mms_chunkLenLV = (u_int32_t *)(data + MMS_SRV_CHUNKLENLV_OFFSET); +- u_int32_t *mms_chunkLenLM = (u_int32_t *)(data + MMS_SRV_CHUNKLENLM_OFFSET); +- u_int32_t *mms_messageLength = (u_int32_t *)(data + MMS_SRV_MESSAGELENGTH_OFFSET); +- +- int zero_padding; +- +- char buffer[28]; /* "\\255.255.255.255\UDP\65635" * 2 (for unicode) */ +- char unicode_buffer[75]; /* 27*2 (unicode) + 20 + 1 */ +- char proto_string[6]; +- +- MUST_BE_LOCKED(&ip_mms_lock); +- +- /* what was the protocol again ? */ +- mms_proto = expect->tuple.dst.protonum; +- sprintf(proto_string, "%u", mms_proto); +- +- DEBUGP("ip_nat_mms: mms_data_fixup: info (seq %u + %u) in %u, proto %s\n", +- expect->seq, ct_mms_info->len, ntohl(tcph->seq), +- mms_proto == IPPROTO_UDP ? "UDP" +- : mms_proto == IPPROTO_TCP ? "TCP":proto_string); +- +- newip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- +- /* Alter conntrack's expectations. */ +- t = expect->tuple; +- t.dst.ip = newip; +- for (port = ct_mms_info->port; port != 0; port++) { +- t.dst.u.tcp.port = htons(port); +- if (ip_conntrack_change_expect(expect, &t) == 0) { +- DEBUGP("ip_nat_mms: mms_data_fixup: using port %d\n", port); +- break; +- } +- } +- +- if(port == 0) +- return 0; +- +- sprintf(buffer, "\\\\%u.%u.%u.%u\\%s\\%u", +- NIPQUAD(newip), +- expect->tuple.dst.protonum == IPPROTO_UDP ? "UDP" +- : expect->tuple.dst.protonum == IPPROTO_TCP ? "TCP":proto_string, +- port); +- DEBUGP("ip_nat_mms: new unicode string=%s\n", buffer); +- +- memset(unicode_buffer, 0, sizeof(char)*75); +- +- for (i=0; ipadding, ct_mms_info->len); +- DEBUGP("ip_nat_mms: mms_data_fixup: offset: %u\n", MMS_SRV_UNICODE_STRING_OFFSET+ct_mms_info->len); +- DUMP_BYTES(data+MMS_SRV_UNICODE_STRING_OFFSET, 60); +- +- /* add end of packet to it */ +- for (j=0; jpadding; ++j) { +- DEBUGP("ip_nat_mms: mms_data_fixup: i=%u j=%u byte=%u\n", +- i, j, (u8)*(data+MMS_SRV_UNICODE_STRING_OFFSET+ct_mms_info->len+j)); +- *(unicode_buffer+i*2+j) = *(data+MMS_SRV_UNICODE_STRING_OFFSET+ct_mms_info->len+j); +- } +- +- /* pad with zeroes at the end ? see explanation of weird math below */ +- zero_padding = (8-(strlen(buffer)*2 + ct_mms_info->padding + 4)%8)%8; +- for (k=0; k chunkLenLV=%u chunkLenLM=%u messageLength=%u\n", +- *mms_chunkLenLV, *mms_chunkLenLM, *mms_messageLength); +- +- /* explanation, before I forget what I did: +- strlen(buffer)*2 + ct_mms_info->padding + 4 must be divisable by 8; +- divide by 8 and add 3 to compute the mms_chunkLenLM field, +- but note that things may have to be padded with zeroes to align by 8 +- bytes, hence we add 7 and divide by 8 to get the correct length */ +- *mms_chunkLenLM = (u_int32_t) (3+(strlen(buffer)*2+ct_mms_info->padding+11)/8); +- *mms_chunkLenLV = *mms_chunkLenLM+2; +- *mms_messageLength = *mms_chunkLenLV*8; +- +- DEBUGP("ip_nat_mms: modified=> chunkLenLV=%u chunkLenLM=%u messageLength=%u\n", +- *mms_chunkLenLV, *mms_chunkLenLM, *mms_messageLength); +- +- ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, +- expect->seq - ntohl(tcph->seq), +- ct_mms_info->len + ct_mms_info->padding, unicode_buffer, +- strlen(buffer)*2 + ct_mms_info->padding + zero_padding); +- DUMP_BYTES(unicode_buffer, 60); +- +- return 1; +-} +- +-static unsigned int +-mms_nat_expected(struct sk_buff **pskb, +- unsigned int hooknum, +- struct ip_conntrack *ct, +- struct ip_nat_info *info) +-{ +- struct ip_nat_multi_range mr; +- u_int32_t newdstip, newsrcip, newip; +- +- struct ip_conntrack *master = master_ct(ct); +- +- IP_NF_ASSERT(info); +- IP_NF_ASSERT(master); +- +- IP_NF_ASSERT(!(info->initialized & (1 << HOOK2MANIP(hooknum)))); +- +- DEBUGP("ip_nat_mms: mms_nat_expected: We have a connection!\n"); +- +- newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip; +- newsrcip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip; +- DEBUGP("ip_nat_mms: mms_nat_expected: hook %s: newsrc->newdst %u.%u.%u.%u->%u.%u.%u.%u\n", +- hooknum == NF_IP_POST_ROUTING ? "POSTROUTING" +- : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING" +- : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???", +- NIPQUAD(newsrcip), NIPQUAD(newdstip)); +- +- if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) +- newip = newsrcip; +- else +- newip = newdstip; +- +- DEBUGP("ip_nat_mms: mms_nat_expected: IP to %u.%u.%u.%u\n", NIPQUAD(newip)); +- +- mr.rangesize = 1; +- /* We don't want to manip the per-protocol, just the IPs. */ +- mr.range[0].flags = IP_NAT_RANGE_MAP_IPS; +- mr.range[0].min_ip = mr.range[0].max_ip = newip; +- +- return ip_nat_setup_info(ct, &mr, hooknum); +-} +- +- +-static unsigned int mms_nat_help(struct ip_conntrack *ct, +- struct ip_conntrack_expect *exp, +- struct ip_nat_info *info, +- enum ip_conntrack_info ctinfo, +- unsigned int hooknum, +- struct sk_buff **pskb) +-{ +- struct iphdr *iph = (*pskb)->nh.iph; +- struct tcphdr *tcph = (void *) iph + iph->ihl * 4; +- unsigned int datalen; +- int dir; +- struct ip_ct_mms_expect *ct_mms_info; +- +- if (!exp) +- DEBUGP("ip_nat_mms: no exp!!"); +- +- ct_mms_info = &exp->help.exp_mms_info; +- +- /* Only mangle things once: original direction in POST_ROUTING +- and reply direction on PRE_ROUTING. */ +- dir = CTINFO2DIR(ctinfo); +- if (!((hooknum == NF_IP_POST_ROUTING && dir == IP_CT_DIR_ORIGINAL) +- ||(hooknum == NF_IP_PRE_ROUTING && dir == IP_CT_DIR_REPLY))) { +- DEBUGP("ip_nat_mms: mms_nat_help: not touching dir %s at hook %s\n", +- dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY", +- hooknum == NF_IP_POST_ROUTING ? "POSTROUTING" +- : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING" +- : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???"); +- return NF_ACCEPT; +- } +- DEBUGP("ip_nat_mms: mms_nat_help: beyond not touching (dir %s at hook %s)\n", +- dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY", +- hooknum == NF_IP_POST_ROUTING ? "POSTROUTING" +- : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING" +- : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???"); +- +- datalen = (*pskb)->len - iph->ihl * 4 - tcph->doff * 4; +- +- DEBUGP("ip_nat_mms: mms_nat_help: %u+%u=%u %u %u\n", exp->seq, ct_mms_info->len, +- exp->seq + ct_mms_info->len, +- ntohl(tcph->seq), +- ntohl(tcph->seq) + datalen); +- +- LOCK_BH(&ip_mms_lock); +- /* Check wether the whole IP/proto/port pattern is carried in the payload */ +- if (between(exp->seq + ct_mms_info->len, +- ntohl(tcph->seq), +- ntohl(tcph->seq) + datalen)) { +- if (!mms_data_fixup(ct_mms_info, ct, pskb, ctinfo, exp)) { +- UNLOCK_BH(&ip_mms_lock); +- return NF_DROP; +- } +- } else { +- /* Half a match? This means a partial retransmisison. +- It's a cracker being funky. */ +- if (net_ratelimit()) { +- printk("ip_nat_mms: partial packet %u/%u in %u/%u\n", +- exp->seq, ct_mms_info->len, +- ntohl(tcph->seq), +- ntohl(tcph->seq) + datalen); +- } +- UNLOCK_BH(&ip_mms_lock); +- return NF_DROP; +- } +- UNLOCK_BH(&ip_mms_lock); +- +- return NF_ACCEPT; +-} +- +-static struct ip_nat_helper mms[MAX_PORTS]; +-static char mms_names[MAX_PORTS][10]; +- +-/* Not __exit: called from init() */ +-static void fini(void) +-{ +- int i; +- +- for (i = 0; (i < MAX_PORTS) && ports[i]; i++) { +- DEBUGP("ip_nat_mms: unregistering helper for port %d\n", ports[i]); +- ip_nat_helper_unregister(&mms[i]); +- } +-} +- +-static int __init init(void) +-{ +- int i, ret = 0; +- char *tmpname; +- +- if (ports[0] == 0) +- ports[0] = MMS_PORT; +- +- for (i = 0; (i < MAX_PORTS) && ports[i]; i++) { +- +- memset(&mms[i], 0, sizeof(struct ip_nat_helper)); +- +- mms[i].tuple.dst.protonum = IPPROTO_TCP; +- mms[i].tuple.src.u.tcp.port = htons(ports[i]); +- mms[i].mask.dst.protonum = 0xFFFF; +- mms[i].mask.src.u.tcp.port = 0xFFFF; +- mms[i].help = mms_nat_help; +- mms[i].me = THIS_MODULE; +- mms[i].flags = 0; +- mms[i].expect = mms_nat_expected; +- +- tmpname = &mms_names[i][0]; +- if (ports[i] == MMS_PORT) +- sprintf(tmpname, "mms"); +- else +- sprintf(tmpname, "mms-%d", i); +- mms[i].name = tmpname; +- +- DEBUGP("ip_nat_mms: register helper for port %d\n", +- ports[i]); +- ret = ip_nat_helper_register(&mms[i]); +- +- if (ret) { +- printk("ip_nat_mms: error registering " +- "helper for port %d\n", ports[i]); +- fini(); +- return ret; +- } +- ports_c++; +- } +- +- return ret; +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_pptp.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_pptp.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_pptp.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_pptp.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,412 +0,0 @@ +-/* +- * ip_nat_pptp.c - Version 1.11 +- * +- * NAT support for PPTP (Point to Point Tunneling Protocol). +- * PPTP is a a protocol for creating virtual private networks. +- * It is a specification defined by Microsoft and some vendors +- * working with Microsoft. PPTP is built on top of a modified +- * version of the Internet Generic Routing Encapsulation Protocol. +- * GRE is defined in RFC 1701 and RFC 1702. Documentation of +- * PPTP can be found in RFC 2637 +- * +- * (C) 2000-2002 by Harald Welte +- * +- * Development of this code funded by Astaro AG (http://www.astaro.com/) +- * +- * TODO: - Support for multiple calls within one session +- * (needs netfilter newnat code) +- * - NAT to a unique tuple, not to TCP source port +- * (needs netfilter tuple reservation) +- * - Support other NAT scenarios than SNAT of PNS +- * +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-MODULE_LICENSE("GPL"); +-MODULE_AUTHOR("Harald Welte "); +-MODULE_DESCRIPTION("Netfilter NAT helper module for PPTP"); +- +- +-#define DEBUGP(format, args...) +- +-static unsigned int +-pptp_nat_expected(struct sk_buff **pskb, +- unsigned int hooknum, +- struct ip_conntrack *ct, +- struct ip_nat_info *info) +-{ +- struct ip_conntrack *master = master_ct(ct); +- struct ip_nat_multi_range mr; +- struct ip_ct_pptp_master *ct_pptp_info; +- struct ip_nat_pptp *nat_pptp_info; +- u_int32_t newsrcip, newdstip, newcid; +- int ret; +- +- IP_NF_ASSERT(info); +- IP_NF_ASSERT(master); +- IP_NF_ASSERT(!(info->initialized & (1 << HOOK2MANIP(hooknum)))); +- +- DEBUGP("we have a connection!\n"); +- +- LOCK_BH(&ip_pptp_lock); +- ct_pptp_info = &master->help.ct_pptp_info; +- nat_pptp_info = &master->nat.help.nat_pptp_info; +- +- /* need to alter GRE tuple because conntrack expectfn() used 'wrong' +- * (unmanipulated) values */ +- if (hooknum == NF_IP_PRE_ROUTING) { +- DEBUGP("completing tuples with NAT info \n"); +- /* we can do this, since we're unconfirmed */ +- if (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u.gre.key == +- htonl(ct_pptp_info->pac_call_id)) { +- /* assume PNS->PAC */ +- ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.gre.key = +- htonl(nat_pptp_info->pns_call_id); +-// ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u.gre.key = +-// htonl(nat_pptp_info->pac_call_id); +- ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u.gre.key = +- htonl(nat_pptp_info->pns_call_id); +- } else { +- /* assume PAC->PNS */ +- DEBUGP("WRONG DIRECTION\n"); +- ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.gre.key = +- htonl(nat_pptp_info->pac_call_id); +- ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u.gre.key = +- htonl(nat_pptp_info->pns_call_id); +- } +- } +- +- if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_DST) { +- newdstip = master->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip; +- newcid = htonl(master->nat.help.nat_pptp_info.pac_call_id); +- +- mr.rangesize = 1; +- mr.range[0].flags = IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED; +- mr.range[0].min_ip = mr.range[0].max_ip = newdstip; +- mr.range[0].min = mr.range[0].max = +- ((union ip_conntrack_manip_proto ) { newcid }); +- DEBUGP("change dest ip to %u.%u.%u.%u\n", +- NIPQUAD(newdstip)); +- DEBUGP("change dest key to 0x%x\n", ntohl(newcid)); +- ret = ip_nat_setup_info(ct, &mr, hooknum); +- } else { +- newsrcip = master->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- /* nat_multi_range is in network byte order, and GRE tuple +- * is 32 bits, not 16 like callID */ +- newcid = htonl(master->help.ct_pptp_info.pns_call_id); +- +- mr.rangesize = 1; +- mr.range[0].flags = IP_NAT_RANGE_MAP_IPS +- |IP_NAT_RANGE_PROTO_SPECIFIED; +- mr.range[0].min_ip = mr.range[0].max_ip = newsrcip; +- mr.range[0].min = mr.range[0].max = +- ((union ip_conntrack_manip_proto ) { newcid }); +- DEBUGP("change src ip to %u.%u.%u.%u\n", +- NIPQUAD(newsrcip)); +- DEBUGP("change 'src' key to 0x%x\n", ntohl(newcid)); +- ret = ip_nat_setup_info(ct, &mr, hooknum); +- } +- +- UNLOCK_BH(&ip_pptp_lock); +- +- return ret; +- +-} +- +-/* outbound packets == from PNS to PAC */ +-static inline unsigned int +-pptp_outbound_pkt(struct tcphdr *tcph, struct pptp_pkt_hdr *pptph, +- size_t datalen, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo, +- struct ip_conntrack_expect *exp) +- +-{ +- struct PptpControlHeader *ctlh; +- union pptp_ctrl_union pptpReq; +- struct ip_ct_pptp_master *ct_pptp_info = &ct->help.ct_pptp_info; +- struct ip_nat_pptp *nat_pptp_info = &ct->nat.help.nat_pptp_info; +- +- u_int16_t msg, *cid = NULL, new_callid; +- +- ctlh = (struct PptpControlHeader *) ((void *) pptph + sizeof(*pptph)); +- pptpReq.rawreq = (void *) ((void *) ctlh + sizeof(*ctlh)); +- +- new_callid = htons(ct_pptp_info->pns_call_id); +- +- switch (msg = ntohs(ctlh->messageType)) { +- case PPTP_OUT_CALL_REQUEST: +- cid = &pptpReq.ocreq->callID; +- +- /* save original call ID in nat_info */ +- nat_pptp_info->pns_call_id = ct_pptp_info->pns_call_id; +- +- new_callid = tcph->source; +- /* save new call ID in ct info */ +- ct_pptp_info->pns_call_id = ntohs(new_callid); +- break; +- case PPTP_IN_CALL_REPLY: +- cid = &pptpReq.icreq->callID; +- break; +- case PPTP_CALL_CLEAR_REQUEST: +- cid = &pptpReq.clrreq->callID; +- break; +- case PPTP_CALL_DISCONNECT_NOTIFY: +- cid = &pptpReq.disc->callID; +- break; +- +- default: +- DEBUGP("unknown outbound packet 0x%04x:%s\n", msg, +- (msg <= PPTP_MSG_MAX)? strMName[msg]:strMName[0]); +- /* fall through */ +- +- case PPTP_SET_LINK_INFO: +- /* only need to NAT in case PAC is behind NAT box */ +- case PPTP_START_SESSION_REQUEST: +- case PPTP_START_SESSION_REPLY: +- case PPTP_STOP_SESSION_REQUEST: +- case PPTP_STOP_SESSION_REPLY: +- case PPTP_ECHO_REQUEST: +- case PPTP_ECHO_REPLY: +- /* no need to alter packet */ +- return NF_ACCEPT; +- } +- +- IP_NF_ASSERT(cid); +- +- DEBUGP("altering call id from 0x%04x to 0x%04x\n", +- ntohs(*cid), ntohs(new_callid)); +- /* mangle packet */ +- tcph->check = ip_nat_cheat_check(*cid^0xFFFF, +- new_callid, tcph->check); +- *cid = new_callid; +- +- return NF_ACCEPT; +-} +- +-/* inbound packets == from PAC to PNS */ +-static inline unsigned int +-pptp_inbound_pkt(struct tcphdr *tcph, struct pptp_pkt_hdr *pptph, +- size_t datalen, +- struct ip_conntrack *ct, +- enum ip_conntrack_info ctinfo, +- struct ip_conntrack_expect *oldexp) +-{ +- struct PptpControlHeader *ctlh; +- union pptp_ctrl_union pptpReq; +- struct ip_ct_pptp_master *ct_pptp_info = &ct->help.ct_pptp_info; +- struct ip_nat_pptp *nat_pptp_info = &ct->nat.help.nat_pptp_info; +- +- u_int16_t msg, new_cid = 0, new_pcid, *pcid = NULL, *cid = NULL; +- u_int32_t old_dst_ip; +- +- struct ip_conntrack_tuple t; +- +- ctlh = (struct PptpControlHeader *) ((void *) pptph + sizeof(*pptph)); +- pptpReq.rawreq = (void *) ((void *) ctlh + sizeof(*ctlh)); +- +- new_pcid = htons(nat_pptp_info->pns_call_id); +- +- switch (msg = ntohs(ctlh->messageType)) { +- case PPTP_OUT_CALL_REPLY: +- pcid = &pptpReq.ocack->peersCallID; +- cid = &pptpReq.ocack->callID; +- if (!oldexp) { +- DEBUGP("outcall but no expectation\n"); +- break; +- } +- old_dst_ip = oldexp->tuple.dst.ip; +- t = oldexp->tuple; +- +- /* save original PAC call ID in nat_info */ +- nat_pptp_info->pac_call_id = ct_pptp_info->pac_call_id; +- +- /* store new callID in ct_info, so conntrack works */ +- //ct_pptp_info->pac_call_id = ntohs(tcph->source); +- //new_cid = htons(ct_pptp_info->pac_call_id); +- +- /* alter expectation */ +- if (t.dst.ip == ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip) { +- /* expectation for PNS->PAC direction */ +- t.dst.u.gre.key = htonl(ct_pptp_info->pac_call_id); +- t.src.u.gre.key = htonl(nat_pptp_info->pns_call_id); +- } else { +- /* expectation for PAC->PNS direction */ +- t.dst.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- DEBUGP("EXPECTATION IN WRONG DIRECTION!!!\n"); +- } +- +- if (!ip_conntrack_change_expect(oldexp, &t)) { +- DEBUGP("successfully changed expect\n"); +- } else { +- DEBUGP("can't change expect\n"); +- } +- ip_ct_gre_keymap_change(oldexp->proto.gre.keymap_orig, &t); +- /* reply keymap */ +- t.src.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip; +- t.dst.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- t.src.u.gre.key = htonl(nat_pptp_info->pac_call_id); +- t.dst.u.gre.key = htonl(ct_pptp_info->pns_call_id); +- ip_ct_gre_keymap_change(oldexp->proto.gre.keymap_reply, &t); +- +- break; +- case PPTP_IN_CALL_CONNECT: +- pcid = &pptpReq.iccon->peersCallID; +- if (!oldexp) +- break; +- old_dst_ip = oldexp->tuple.dst.ip; +- t = oldexp->tuple; +- +- /* alter expectation, no need for callID */ +- if (t.dst.ip == ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip) { +- /* expectation for PNS->PAC direction */ +- t.src.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- } else { +- /* expectation for PAC->PNS direction */ +- t.dst.ip = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip; +- } +- +- if (!ip_conntrack_change_expect(oldexp, &t)) { +- DEBUGP("successfully changed expect\n"); +- } else { +- DEBUGP("can't change expect\n"); +- } +- break; +- case PPTP_IN_CALL_REQUEST: +- /* only need to nat in case PAC is behind NAT box */ +- break; +- case PPTP_WAN_ERROR_NOTIFY: +- pcid = &pptpReq.wanerr->peersCallID; +- break; +- default: +- DEBUGP("unknown inbound packet %s\n", +- (msg <= PPTP_MSG_MAX)? strMName[msg]:strMName[0]); +- /* fall through */ +- +- case PPTP_START_SESSION_REQUEST: +- case PPTP_START_SESSION_REPLY: +- case PPTP_STOP_SESSION_REQUEST: +- case PPTP_ECHO_REQUEST: +- case PPTP_ECHO_REPLY: +- /* no need to alter packet */ +- return NF_ACCEPT; +- } +- +- /* mangle packet */ +- IP_NF_ASSERT(pcid); +- DEBUGP("altering peer call id from 0x%04x to 0x%04x\n", +- ntohs(*pcid), ntohs(new_pcid)); +- tcph->check = ip_nat_cheat_check(*pcid^0xFFFF, +- new_pcid, tcph->check); +- *pcid = new_pcid; +- +- if (new_cid) { +- IP_NF_ASSERT(cid); +- DEBUGP("altering call id from 0x%04x to 0x%04x\n", +- ntohs(*cid), ntohs(new_cid)); +- tcph->check = ip_nat_cheat_check(*cid^0xFFFF, +- new_cid, tcph->check); +- *cid = new_cid; +- } +- +- /* great, at least we don't need to resize packets */ +- return NF_ACCEPT; +-} +- +- +-static unsigned int tcp_help(struct ip_conntrack *ct, +- struct ip_conntrack_expect *exp, +- struct ip_nat_info *info, +- enum ip_conntrack_info ctinfo, +- unsigned int hooknum, struct sk_buff **pskb) +-{ +- struct iphdr *iph = (*pskb)->nh.iph; +- struct tcphdr *tcph = (void *) iph + iph->ihl*4; +- unsigned int datalen = (*pskb)->len - iph->ihl*4 - tcph->doff*4; +- struct pptp_pkt_hdr *pptph; +- void *datalimit; +- +- int dir; +- +- DEBUGP("entering\n"); +- +- /* Only mangle things once: original direction in POST_ROUTING +- and reply direction on PRE_ROUTING. */ +- dir = CTINFO2DIR(ctinfo); +- if (!((hooknum == NF_IP_POST_ROUTING && dir == IP_CT_DIR_ORIGINAL) +- || (hooknum == NF_IP_PRE_ROUTING && dir == IP_CT_DIR_REPLY))) { +- DEBUGP("Not touching dir %s at hook %s\n", +- dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY", +- hooknum == NF_IP_POST_ROUTING ? "POSTROUTING" +- : hooknum == NF_IP_PRE_ROUTING ? "PREROUTING" +- : hooknum == NF_IP_LOCAL_OUT ? "OUTPUT" : "???"); +- return NF_ACCEPT; +- } +- +- /* if packet is too small, just skip it */ +- if (datalen < sizeof(struct pptp_pkt_hdr)+ +- sizeof(struct PptpControlHeader)) { +- DEBUGP("pptp packet too short\n"); +- return NF_ACCEPT; +- } +- +- +- pptph = (struct pptp_pkt_hdr *) ((void *)tcph + tcph->doff*4); +- datalimit = (void *) pptph + datalen; +- +- LOCK_BH(&ip_pptp_lock); +- +- if (dir == IP_CT_DIR_ORIGINAL) { +- /* reuqests sent by client to server (PNS->PAC) */ +- pptp_outbound_pkt(tcph, pptph, datalen, ct, ctinfo, exp); +- } else { +- /* response from the server to the client (PAC->PNS) */ +- pptp_inbound_pkt(tcph, pptph, datalen, ct, ctinfo, exp); +- } +- +- UNLOCK_BH(&ip_pptp_lock); +- +- return NF_ACCEPT; +-} +- +-/* nat helper struct for control connection */ +-static struct ip_nat_helper pptp_tcp_helper = { +- { NULL, NULL }, +- "pptp", IP_NAT_HELPER_F_ALWAYS, THIS_MODULE, +- { { 0, { tcp: { port: __constant_htons(PPTP_CONTROL_PORT) } } }, +- { 0, { 0 }, IPPROTO_TCP } }, +- { { 0, { tcp: { port: 0xFFFF } } }, +- { 0, { 0 }, 0xFFFF } }, +- tcp_help, pptp_nat_expected }; +- +- +-static int __init init(void) +-{ +- DEBUGP("init_module\n" ); +- +- if (ip_nat_helper_register(&pptp_tcp_helper)) +- return -EIO; +- +- return 0; +-} +- +-static void __exit fini(void) +-{ +- DEBUGP("cleanup_module\n" ); +- ip_nat_helper_unregister(&pptp_tcp_helper); +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_proto_gre.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_proto_gre.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_proto_gre.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_proto_gre.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,212 +0,0 @@ +-/* +- * ip_nat_proto_gre.c - Version 1.11 +- * +- * NAT protocol helper module for GRE. +- * +- * GRE is a generic encapsulation protocol, which is generally not very +- * suited for NAT, as it has no protocol-specific part as port numbers. +- * +- * It has an optional key field, which may help us distinguishing two +- * connections between the same two hosts. +- * +- * GRE is defined in RFC 1701 and RFC 1702, as well as RFC 2784 +- * +- * PPTP is built on top of a modified version of GRE, and has a mandatory +- * field called "CallID", which serves us for the same purpose as the key +- * field in plain GRE. +- * +- * Documentation about PPTP can be found in RFC 2637 +- * +- * (C) 2000-2002 by Harald Welte +- * +- * Development of this code funded by Astaro AG (http://www.astaro.com/) +- * +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-MODULE_LICENSE("GPL"); +-MODULE_AUTHOR("Harald Welte "); +-MODULE_DESCRIPTION("Netfilter NAT protocol helper module for GRE"); +- +-#define DEBUGP(x, args...) +- +-/* is key in given range between min and max */ +-static int +-gre_in_range(const struct ip_conntrack_tuple *tuple, +- enum ip_nat_manip_type maniptype, +- const union ip_conntrack_manip_proto *min, +- const union ip_conntrack_manip_proto *max) +-{ +- return ntohl(tuple->src.u.gre.key) >= ntohl(min->gre.key) +- && ntohl(tuple->src.u.gre.key) <= ntohl(max->gre.key); +-} +- +-/* generate unique tuple ... */ +-static int +-gre_unique_tuple(struct ip_conntrack_tuple *tuple, +- const struct ip_nat_range *range, +- enum ip_nat_manip_type maniptype, +- const struct ip_conntrack *conntrack) +-{ +- u_int32_t min, i, range_size; +- u_int32_t key = 0, *keyptr; +- +- if (maniptype == IP_NAT_MANIP_SRC) +- keyptr = &tuple->src.u.gre.key; +- else +- keyptr = &tuple->dst.u.gre.key; +- +- if (!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED)) { +- +- switch (tuple->dst.u.gre.version) { +- case 0: +- DEBUGP("NATing GRE version 0 (ct=%p)\n", +- conntrack); +- min = 1; +- range_size = 0xffffffff; +- break; +- case GRE_VERSION_PPTP: +- DEBUGP("%p: NATing GRE PPTP\n", +- conntrack); +- min = 1; +- range_size = 0xffff; +- break; +- default: +- printk(KERN_WARNING "nat_gre: unknown GRE version\n"); +- return 0; +- break; +- } +- +- } else { +- min = ntohl(range->min.gre.key); +- range_size = ntohl(range->max.gre.key) - min + 1; +- } +- +- DEBUGP("min = %u, range_size = %u\n", min, range_size); +- +- for (i = 0; i < range_size; i++, key++) { +- *keyptr = htonl(min + key % range_size); +- if (!ip_nat_used_tuple(tuple, conntrack)) +- return 1; +- } +- +- DEBUGP("%p: no NAT mapping\n", conntrack); +- +- return 0; +-} +- +-/* manipulate a GRE packet according to maniptype */ +-static void +-gre_manip_pkt(struct iphdr *iph, size_t len, +- const struct ip_conntrack_manip *manip, +- enum ip_nat_manip_type maniptype) +-{ +- struct gre_hdr *greh = (struct gre_hdr *)((u_int32_t *)iph+iph->ihl); +- struct gre_hdr_pptp *pgreh = (struct gre_hdr_pptp *) greh; +- +- /* we only have destination manip of a packet, since 'source key' +- * is not present in the packet itself */ +- if (maniptype == IP_NAT_MANIP_DST) { +- /* key manipulation is always dest */ +- switch (greh->version) { +- case 0: +- if (!greh->key) { +- DEBUGP("can't nat GRE w/o key\n"); +- break; +- } +- if (greh->csum) { +- *(gre_csum(greh)) = +- ip_nat_cheat_check(~*(gre_key(greh)), +- manip->u.gre.key, +- *(gre_csum(greh))); +- } +- *(gre_key(greh)) = manip->u.gre.key; +- break; +- case GRE_VERSION_PPTP: +- DEBUGP("call_id -> 0x%04x\n", +- ntohl(manip->u.gre.key)); +- pgreh->call_id = htons(ntohl(manip->u.gre.key)); +- break; +- default: +- DEBUGP("can't nat unknown GRE version\n"); +- break; +- } +- } +-} +- +-/* print out a nat tuple */ +-static unsigned int +-gre_print(char *buffer, +- const struct ip_conntrack_tuple *match, +- const struct ip_conntrack_tuple *mask) +-{ +- unsigned int len = 0; +- +- if (mask->dst.u.gre.version) +- len += sprintf(buffer + len, "version=%d ", +- ntohs(match->dst.u.gre.version)); +- +- if (mask->dst.u.gre.protocol) +- len += sprintf(buffer + len, "protocol=0x%x ", +- ntohs(match->dst.u.gre.protocol)); +- +- if (mask->src.u.gre.key) +- len += sprintf(buffer + len, "srckey=0x%x ", +- ntohl(match->src.u.gre.key)); +- +- if (mask->dst.u.gre.key) +- len += sprintf(buffer + len, "dstkey=0x%x ", +- ntohl(match->src.u.gre.key)); +- +- return len; +-} +- +-/* print a range of keys */ +-static unsigned int +-gre_print_range(char *buffer, const struct ip_nat_range *range) +-{ +- if (range->min.gre.key != 0 +- || range->max.gre.key != 0xFFFF) { +- if (range->min.gre.key == range->max.gre.key) +- return sprintf(buffer, "key 0x%x ", +- ntohl(range->min.gre.key)); +- else +- return sprintf(buffer, "keys 0x%u-0x%u ", +- ntohl(range->min.gre.key), +- ntohl(range->max.gre.key)); +- } else +- return 0; +-} +- +-/* nat helper struct */ +-static struct ip_nat_protocol gre = +- { { NULL, NULL }, "GRE", IPPROTO_GRE, +- gre_manip_pkt, +- gre_in_range, +- gre_unique_tuple, +- gre_print, +- gre_print_range +- }; +- +-static int __init init(void) +-{ +- if (ip_nat_protocol_register(&gre)) +- return -EIO; +- +- return 0; +-} +- +-static void __exit fini(void) +-{ +- ip_nat_protocol_unregister(&gre); +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_standalone.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_standalone.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_standalone.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_standalone.c 2004-05-09 04:13:03.000000000 -0400 +@@ -37,7 +37,11 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + #define HOOKNAME(hooknum) ((hooknum) == NF_IP_POST_ROUTING ? "POST_ROUTING" \ + : ((hooknum) == NF_IP_PRE_ROUTING ? "PRE_ROUTING" \ +@@ -354,6 +358,5 @@ + EXPORT_SYMBOL(ip_nat_helper_unregister); + EXPORT_SYMBOL(ip_nat_cheat_check); + EXPORT_SYMBOL(ip_nat_mangle_tcp_packet); +-EXPORT_SYMBOL(ip_nat_mangle_udp_packet); + EXPORT_SYMBOL(ip_nat_used_tuple); + MODULE_LICENSE("GPL"); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_nat_tftp.c src/linux/linux.stock/net/ipv4/netfilter/ip_nat_tftp.c +--- src/linux/linux/net/ipv4/netfilter/ip_nat_tftp.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_nat_tftp.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,186 +0,0 @@ +-/* +- * Licensed under GNU GPL version 2 Copyright Magnus Boden +- * Version: 0.0.7 +- * +- * Thu 21 Mar 2002 Harald Welte +- * - Port to newnat API +- * +- * This module currently supports DNAT: +- * iptables -t nat -A PREROUTING -d x.x.x.x -j DNAT --to-dest x.x.x.y +- * +- * and SNAT: +- * iptables -t nat -A POSTROUTING { -j MASQUERADE , -j SNAT --to-source x.x.x.x } +- * +- * It has not been tested with +- * -j SNAT --to-source x.x.x.x-x.x.x.y since I only have one external ip +- * If you do test this please let me know if it works or not. +- * +- */ +- +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-MODULE_AUTHOR("Magnus Boden "); +-MODULE_DESCRIPTION("Netfilter NAT helper for tftp"); +-MODULE_LICENSE("GPL"); +- +-#define MAX_PORTS 8 +- +-static int ports[MAX_PORTS]; +-static int ports_c = 0; +-#ifdef MODULE_PARM +-MODULE_PARM(ports,"1-" __MODULE_STRING(MAX_PORTS) "i"); +-MODULE_PARM_DESC(ports, "port numbers of tftp servers"); +-#endif +- +-#define DEBUGP(format, args...) +-static unsigned int +-tftp_nat_help(struct ip_conntrack *ct, +- struct ip_conntrack_expect *exp, +- struct ip_nat_info *info, +- enum ip_conntrack_info ctinfo, +- unsigned int hooknum, +- struct sk_buff **pskb) +-{ +- int dir = CTINFO2DIR(ctinfo); +- struct iphdr *iph = (*pskb)->nh.iph; +- struct udphdr *udph = (void *)iph + iph->ihl * 4; +- struct tftphdr *tftph = (void *)udph + 8; +- struct ip_conntrack_tuple repl; +- +- if (!((hooknum == NF_IP_POST_ROUTING && dir == IP_CT_DIR_ORIGINAL) +- || (hooknum == NF_IP_PRE_ROUTING && dir == IP_CT_DIR_REPLY))) +- return NF_ACCEPT; +- +- if (!exp) { +- DEBUGP("no conntrack expectation to modify\n"); +- return NF_ACCEPT; +- } +- +- switch (ntohs(tftph->opcode)) { +- /* RRQ and WRQ works the same way */ +- case TFTP_OPCODE_READ: +- case TFTP_OPCODE_WRITE: +- repl = ct->tuplehash[IP_CT_DIR_REPLY].tuple; +- DEBUGP(""); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); +- DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); +- DEBUGP("expecting: "); +- DUMP_TUPLE_RAW(&repl); +- DUMP_TUPLE_RAW(&exp->mask); +- ip_conntrack_change_expect(exp, &repl); +- break; +- default: +- DEBUGP("Unknown opcode\n"); +- } +- +- return NF_ACCEPT; +-} +- +-static unsigned int +-tftp_nat_expected(struct sk_buff **pskb, +- unsigned int hooknum, +- struct ip_conntrack *ct, +- struct ip_nat_info *info) +-{ +- const struct ip_conntrack *master = ct->master->expectant; +- const struct ip_conntrack_tuple *orig = +- &master->tuplehash[IP_CT_DIR_ORIGINAL].tuple; +- struct ip_nat_multi_range mr; +- +- IP_NF_ASSERT(info); +- IP_NF_ASSERT(master); +- IP_NF_ASSERT(!(info->initialized & (1 << HOOK2MANIP(hooknum)))); +- +- mr.rangesize = 1; +- mr.range[0].flags = IP_NAT_RANGE_MAP_IPS; +- +- if (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC) { +- mr.range[0].min_ip = mr.range[0].max_ip = orig->dst.ip; +- DEBUGP("orig: %u.%u.%u.%u:%u <-> %u.%u.%u.%u:%u " +- "newsrc: %u.%u.%u.%u\n", +- NIPQUAD((*pskb)->nh.iph->saddr), ntohs(udph->source), +- NIPQUAD((*pskb)->nh.iph->daddr), ntohs(udph->dest), +- NIPQUAD(orig->dst.ip)); +- } else { +- mr.range[0].min_ip = mr.range[0].max_ip = orig->src.ip; +- mr.range[0].min.udp.port = mr.range[0].max.udp.port = +- orig->src.u.udp.port; +- mr.range[0].flags |= IP_NAT_RANGE_PROTO_SPECIFIED; +- +- DEBUGP("orig: %u.%u.%u.%u:%u <-> %u.%u.%u.%u:%u " +- "newdst: %u.%u.%u.%u:%u\n", +- NIPQUAD((*pskb)->nh.iph->saddr), ntohs(udph->source), +- NIPQUAD((*pskb)->nh.iph->daddr), ntohs(udph->dest), +- NIPQUAD(orig->src.ip), ntohs(orig->src.u.udp.port)); +- } +- +- return ip_nat_setup_info(ct,&mr,hooknum); +-} +- +-static struct ip_nat_helper tftp[MAX_PORTS]; +-static char tftp_names[MAX_PORTS][10]; +- +-static void fini(void) +-{ +- int i; +- +- for (i = 0 ; i < ports_c; i++) { +- DEBUGP("unregistering helper for port %d\n", ports[i]); +- ip_nat_helper_unregister(&tftp[i]); +- } +-} +- +-static int __init init(void) +-{ +- int i, ret; +- char *tmpname; +- +- if (!ports[0]) +- ports[0] = TFTP_PORT; +- +- for (i = 0 ; (i < MAX_PORTS) && ports[i] ; i++) { +- memset(&tftp[i], 0, sizeof(struct ip_nat_helper)); +- +- tftp[i].tuple.dst.protonum = IPPROTO_UDP; +- tftp[i].tuple.src.u.udp.port = htons(ports[i]); +- tftp[i].mask.dst.protonum = 0xFFFF; +- tftp[i].mask.src.u.udp.port = 0xFFFF; +- tftp[i].help = tftp_nat_help; +- tftp[i].flags = 0; +- tftp[i].me = THIS_MODULE; +- tftp[i].expect = tftp_nat_expected; +- +- tmpname = &tftp_names[i][0]; +- if (ports[i] == TFTP_PORT) +- sprintf(tmpname, "tftp"); +- else +- sprintf(tmpname, "tftp-%d", i); +- tftp[i].name = tmpname; +- +- DEBUGP("ip_nat_tftp: registering for port %d: name %s\n", +- ports[i], tftp[i].name); +- ret = ip_nat_helper_register(&tftp[i]); +- +- if (ret) { +- printk("ip_nat_tftp: unable to register for port %d\n", +- ports[i]); +- fini(); +- return ret; +- } +- ports_c++; +- } +- return ret; +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ip_pool.c src/linux/linux.stock/net/ipv4/netfilter/ip_pool.c +--- src/linux/linux/net/ipv4/netfilter/ip_pool.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ip_pool.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,328 +0,0 @@ +-/* Kernel module for IP pool management */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#define DP(format, args...) +- +-MODULE_LICENSE("GPL"); +- +-#define NR_POOL 16 +-static int nr_pool = NR_POOL;/* overwrite this when loading module */ +- +-struct ip_pool { +- u_int32_t first_ip; /* host byte order, included in range */ +- u_int32_t last_ip; /* host byte order, included in range */ +- void *members; /* the bitmap proper */ +- int nr_use; /* total nr. of tests through this */ +- int nr_match; /* total nr. of matches through this */ +- rwlock_t lock; +-}; +- +-static struct ip_pool *POOL; +- +-static inline struct ip_pool *lookup(ip_pool_t index) +-{ +- if (index < 0 || index >= nr_pool) { +- DP("ip_pool:lookup: bad index %d\n", index); +- return 0; +- } +- return POOL+index; +-} +- +-int ip_pool_match(ip_pool_t index, u_int32_t addr) +-{ +- struct ip_pool *pool = lookup(index); +- int res = 0; +- +- if (!pool || !pool->members) +- return 0; +- read_lock_bh(&pool->lock); +- if (pool->members) { +- if (addr >= pool->first_ip && addr <= pool->last_ip) { +- addr -= pool->first_ip; +- if (test_bit(addr, pool->members)) { +- res = 1; +-#ifdef CONFIG_IP_POOL_STATISTICS +- pool->nr_match++; +-#endif +- } +- } +-#ifdef CONFIG_IP_POOL_STATISTICS +- pool->nr_use++; +-#endif +- } +- read_unlock_bh(&pool->lock); +- return res; +-} +- +-static int pool_change(ip_pool_t index, u_int32_t addr, int isdel) +-{ +- struct ip_pool *pool; +- int res = -1; +- +- pool = lookup(index); +- if ( !pool || !pool->members +- || addr < pool->first_ip || addr > pool->last_ip) +- return -1; +- read_lock_bh(&pool->lock); +- if (pool->members && addr >= pool->first_ip && addr <= pool->last_ip) { +- addr -= pool->first_ip; +- res = isdel +- ? (0 != test_and_clear_bit(addr, pool->members)) +- : (0 != test_and_set_bit(addr, pool->members)); +- } +- read_unlock_bh(&pool->lock); +- return res; +-} +- +-int ip_pool_mod(ip_pool_t index, u_int32_t addr, int isdel) +-{ +- int res = pool_change(index,addr,isdel); +- +- if (!isdel) res = !res; +- return res; +-} +- +-static inline int bitmap_bytes(u_int32_t a, u_int32_t b) +-{ +- return 4*((((b-a+8)/8)+3)/4); +-} +- +-static inline int poolbytes(ip_pool_t index) +-{ +- struct ip_pool *pool = lookup(index); +- +- return pool ? bitmap_bytes(pool->first_ip, pool->last_ip) : 0; +-} +- +-static int setpool( +- struct sock *sk, +- int optval, +- void *user, +- unsigned int len +-) { +- struct ip_pool_request req; +- +- DP("ip_pool:setpool: optval=%d, user=%p, len=%d\n", optval, user, len); +- if (!capable(CAP_NET_ADMIN)) +- return -EPERM; +- if (optval != SO_IP_POOL) +- return -EBADF; +- if (len != sizeof(req)) +- return -EINVAL; +- if (copy_from_user(&req, user, sizeof(req)) != 0) +- return -EFAULT; +- printk("obsolete op - upgrade your ippool(8) utility.\n"); +- return -EINVAL; +-} +- +-static int getpool( +- struct sock *sk, +- int optval, +- void *user, +- int *len +-) { +- struct ip_pool_request req; +- struct ip_pool *pool; +- ip_pool_t i; +- int newbytes; +- void *newmembers; +- int res; +- +- DP("ip_pool:getpool: optval=%d, user=%p\n", optval, user); +- if (!capable(CAP_NET_ADMIN)) +- return -EINVAL; +- if (optval != SO_IP_POOL) +- return -EINVAL; +- if (*len != sizeof(req)) { +- return -EFAULT; +- } +- if (copy_from_user(&req, user, sizeof(req)) != 0) +- return -EFAULT; +- DP("ip_pool:getpool op=%d, index=%d\n", req.op, req.index); +- if (req.op < IP_POOL_BAD001) { +- printk("obsolete op - upgrade your ippool(8) utility.\n"); +- return -EFAULT; +- } +- switch(req.op) { +- case IP_POOL_HIGH_NR: +- DP("ip_pool HIGH_NR\n"); +- req.index = IP_POOL_NONE; +- for (i=0; imembers) +- return -EBADF; +- req.addr = htonl(pool->first_ip); +- req.addr2 = htonl(pool->last_ip); +- return copy_to_user(user, &req, sizeof(req)); +- case IP_POOL_USAGE: +- DP("ip_pool USE\n"); +- pool = lookup(req.index); +- if (!pool) +- return -EINVAL; +- if (!pool->members) +- return -EBADF; +- req.addr = pool->nr_use; +- req.addr2 = pool->nr_match; +- return copy_to_user(user, &req, sizeof(req)); +- case IP_POOL_TEST_ADDR: +- DP("ip_pool TEST 0x%08x\n", req.addr); +- pool = lookup(req.index); +- if (!pool) +- return -EINVAL; +- res = 0; +- read_lock_bh(&pool->lock); +- if (!pool->members) { +- DP("ip_pool TEST_ADDR no members in pool\n"); +- res = -EBADF; +- goto unlock_and_return_res; +- } +- req.addr = ntohl(req.addr); +- if (req.addr < pool->first_ip) { +- DP("ip_pool TEST_ADDR address < pool bounds\n"); +- res = -ERANGE; +- goto unlock_and_return_res; +- } +- if (req.addr > pool->last_ip) { +- DP("ip_pool TEST_ADDR address > pool bounds\n"); +- res = -ERANGE; +- goto unlock_and_return_res; +- } +- req.addr = (0 != test_bit((req.addr - pool->first_ip), +- pool->members)); +- read_unlock_bh(&pool->lock); +- return copy_to_user(user, &req, sizeof(req)); +- case IP_POOL_FLUSH: +- DP("ip_pool FLUSH not yet implemented.\n"); +- return -EBUSY; +- case IP_POOL_DESTROY: +- DP("ip_pool DESTROY not yet implemented.\n"); +- return -EBUSY; +- case IP_POOL_INIT: +- DP("ip_pool INIT 0x%08x-0x%08x\n", req.addr, req.addr2); +- pool = lookup(req.index); +- if (!pool) +- return -EINVAL; +- req.addr = ntohl(req.addr); +- req.addr2 = ntohl(req.addr2); +- if (req.addr > req.addr2) { +- DP("ip_pool INIT bad ip range\n"); +- return -EINVAL; +- } +- newbytes = bitmap_bytes(req.addr, req.addr2); +- newmembers = kmalloc(newbytes, GFP_KERNEL); +- if (!newmembers) { +- DP("ip_pool INIT out of mem for %d bytes\n", newbytes); +- return -ENOMEM; +- } +- memset(newmembers, 0, newbytes); +- write_lock_bh(&pool->lock); +- if (pool->members) { +- DP("ip_pool INIT pool %d exists\n", req.index); +- kfree(newmembers); +- res = -EBUSY; +- goto unlock_and_return_res; +- } +- pool->first_ip = req.addr; +- pool->last_ip = req.addr2; +- pool->nr_use = 0; +- pool->nr_match = 0; +- pool->members = newmembers; +- write_unlock_bh(&pool->lock); +- return 0; +- case IP_POOL_ADD_ADDR: +- DP("ip_pool ADD_ADDR 0x%08x\n", req.addr); +- req.addr = pool_change(req.index, ntohl(req.addr), 0); +- return copy_to_user(user, &req, sizeof(req)); +- case IP_POOL_DEL_ADDR: +- DP("ip_pool DEL_ADDR 0x%08x\n", req.addr); +- req.addr = pool_change(req.index, ntohl(req.addr), 1); +- return copy_to_user(user, &req, sizeof(req)); +- default: +- DP("ip_pool:getpool bad op %d\n", req.op); +- return -EINVAL; +- } +- return -EINVAL; +- +-unlock_and_return_res: +- if (pool) +- read_unlock_bh(&pool->lock); +- return res; +-} +- +-static struct nf_sockopt_ops so_pool +-= { { NULL, NULL }, PF_INET, +- SO_IP_POOL, SO_IP_POOL+1, &setpool, +- SO_IP_POOL, SO_IP_POOL+1, &getpool, +- 0, NULL }; +- +-MODULE_PARM(nr_pool, "i"); +- +-static int __init init(void) +-{ +- ip_pool_t i; +- int res; +- +- if (nr_pool < 1) { +- printk("ip_pool module init: bad nr_pool %d\n", nr_pool); +- return -EINVAL; +- } +- POOL = kmalloc(nr_pool * sizeof(*POOL), GFP_KERNEL); +- if (!POOL) { +- printk("ip_pool module init: out of memory for nr_pool %d\n", +- nr_pool); +- return -ENOMEM; +- } +- for (i=0; i + #include + ++#if 0 ++/* All the better to debug you with... */ ++#define static ++#define inline ++#endif + + /* Locking is simple: we assume at worst case there will be one packet + in user context and one from bottom halves (or soft irq if Alexey's +@@ -83,6 +88,7 @@ + { + /* Size per table */ + unsigned int size; ++ /* Number of entries: FIXME. --RR */ + unsigned int number; + /* Initial number of entries. Needed for module usage count */ + unsigned int initial_entries; +@@ -106,6 +112,11 @@ + #define TABLE_OFFSET(t,p) 0 + #endif + ++#if 0 ++#define down(x) do { printk("DOWN:%u:" #x "\n", __LINE__); down(x); } while(0) ++#define down_interruptible(x) ({ int __r; printk("DOWNi:%u:" #x "\n", __LINE__); __r = down_interruptible(x); if (__r != 0) printk("ABORT-DOWNi:%u\n", __LINE__); __r; }) ++#define up(x) do { printk("UP:%u:" #x "\n", __LINE__); up(x); } while(0) ++#endif + + /* Returns whether matches rule or not. */ + static inline int +@@ -408,6 +419,12 @@ + { + void *ret; + ++#if 0 ++ duprintf("find_inlist: searching for `%s' in %s.\n", ++ name, head == &ipt_target ? "ipt_target" ++ : head == &ipt_match ? "ipt_match" ++ : head == &ipt_tables ? "ipt_tables" : "UNKNOWN"); ++#endif + + *error = down_interruptible(mutex); + if (*error != 0) +@@ -745,6 +762,8 @@ + newinfo->underflow[h] = underflows[h]; + } + ++ /* FIXME: underflows must be unconditional, standard verdicts ++ < 0 (not IPT_RETURN). --RR */ + + /* Clear counters and comefrom */ + e->counters = ((struct ipt_counters) { 0, 0 }); +@@ -957,6 +976,7 @@ + goto free_counters; + } + ++ /* FIXME: use iterator macros --RR */ + /* ... then go back and fix counters and names */ + for (off = 0, num = 0; off < total_size; off += e->next_offset, num++){ + unsigned int i; +@@ -1134,6 +1154,14 @@ + const struct ipt_counters addme[], + unsigned int *i) + { ++#if 0 ++ duprintf("add_counter: Entry %u %lu/%lu + %lu/%lu\n", ++ *i, ++ (long unsigned int)e->counters.pcnt, ++ (long unsigned int)e->counters.bcnt, ++ (long unsigned int)addme[*i].pcnt, ++ (long unsigned int)addme[*i].bcnt); ++#endif + + ADD_COUNTER(e->counters, addme[*i].bcnt, addme[*i].pcnt); + +@@ -1495,6 +1523,7 @@ + return 0; + } + ++ /* FIXME: Try tcp doff >> packet len against various stacks --RR */ + + #define FWINVTCP(bool,invflg) ((bool) ^ !!(tcpinfo->invflags & invflg)) + +@@ -1670,15 +1699,14 @@ + = { { NULL, NULL }, "icmp", &icmp_match, &icmp_checkentry, NULL }; + + #ifdef CONFIG_PROC_FS +-static inline int print_name(const char *i, ++static inline int print_name(const struct ipt_table *t, + off_t start_offset, char *buffer, int length, + off_t *pos, unsigned int *count) + { + if ((*count)++ >= start_offset) { + unsigned int namelen; + +- namelen = sprintf(buffer + *pos, "%s\n", +- i + sizeof(struct list_head)); ++ namelen = sprintf(buffer + *pos, "%s\n", t->name); + if (*pos + namelen > length) { + /* Stop iterating */ + return 1; +@@ -1696,7 +1724,7 @@ + if (down_interruptible(&ipt_mutex) != 0) + return 0; + +- LIST_FIND(&ipt_tables, print_name, void *, ++ LIST_FIND(&ipt_tables, print_name, struct ipt_table *, + offset, buffer, length, &pos, &count); + + up(&ipt_mutex); +@@ -1705,46 +1733,6 @@ + *start=(char *)((unsigned long)count-offset); + return pos; + } +- +-static int ipt_get_targets(char *buffer, char **start, off_t offset, int length) +-{ +- off_t pos = 0; +- unsigned int count = 0; +- +- if (down_interruptible(&ipt_mutex) != 0) +- return 0; +- +- LIST_FIND(&ipt_target, print_name, void *, +- offset, buffer, length, &pos, &count); +- +- up(&ipt_mutex); +- +- *start = (char *)((unsigned long)count - offset); +- return pos; +-} +- +-static int ipt_get_matches(char *buffer, char **start, off_t offset, int length) +-{ +- off_t pos = 0; +- unsigned int count = 0; +- +- if (down_interruptible(&ipt_mutex) != 0) +- return 0; +- +- LIST_FIND(&ipt_match, print_name, void *, +- offset, buffer, length, &pos, &count); +- +- up(&ipt_mutex); +- +- *start = (char *)((unsigned long)count - offset); +- return pos; +-} +- +-static struct { char *name; get_info_t *get_info; } ipt_proc_entry[] = +-{ { "ip_tables_names", ipt_get_tables }, +- { "ip_tables_targets", ipt_get_targets }, +- { "ip_tables_matches", ipt_get_matches }, +- { NULL, NULL} }; + #endif /*CONFIG_PROC_FS*/ + + static int __init init(void) +@@ -1770,20 +1758,14 @@ + #ifdef CONFIG_PROC_FS + { + struct proc_dir_entry *proc; +- int i; + +- for (i = 0; ipt_proc_entry[i].name; i++) { +- proc = proc_net_create(ipt_proc_entry[i].name, 0, +- ipt_proc_entry[i].get_info); ++ proc = proc_net_create("ip_tables_names", 0, ipt_get_tables); + if (!proc) { +- while (--i >= 0) +- proc_net_remove(ipt_proc_entry[i].name); + nf_unregister_sockopt(&ipt_sockopts); + return -ENOMEM; + } + proc->owner = THIS_MODULE; + } +- } + #endif + + printk("ip_tables: (C) 2000-2002 Netfilter core team\n"); +@@ -1794,11 +1776,7 @@ + { + nf_unregister_sockopt(&ipt_sockopts); + #ifdef CONFIG_PROC_FS +- { +- int i; +- for (i = 0; ipt_proc_entry[i].name; i++) +- proc_net_remove(ipt_proc_entry[i].name); +- } ++ proc_net_remove("ip_tables_names"); + #endif + } + +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipchains_core.c src/linux/linux.stock/net/ipv4/netfilter/ipchains_core.c +--- src/linux/linux/net/ipv4/netfilter/ipchains_core.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipchains_core.c 2004-05-09 04:13:03.000000000 -0400 +@@ -977,10 +977,17 @@ + || ftmp->ipfw.fw_dst.s_addr!=frwl->ipfw.fw_dst.s_addr + || ftmp->ipfw.fw_smsk.s_addr!=frwl->ipfw.fw_smsk.s_addr + || ftmp->ipfw.fw_dmsk.s_addr!=frwl->ipfw.fw_dmsk.s_addr ++#if 0 ++ || ftmp->ipfw.fw_flg!=frwl->ipfw.fw_flg ++#else + || ((ftmp->ipfw.fw_flg & ~IP_FW_F_MARKABS) + != (frwl->ipfw.fw_flg & ~IP_FW_F_MARKABS)) ++#endif + || ftmp->ipfw.fw_invflg!=frwl->ipfw.fw_invflg + || ftmp->ipfw.fw_proto!=frwl->ipfw.fw_proto ++#if 0 ++ || ftmp->ipfw.fw_mark!=frwl->ipfw.fw_mark ++#endif + || ftmp->ipfw.fw_redirpt!=frwl->ipfw.fw_redirpt + || ftmp->ipfw.fw_spts[0]!=frwl->ipfw.fw_spts[0] + || ftmp->ipfw.fw_spts[1]!=frwl->ipfw.fw_spts[1] +@@ -1566,6 +1573,7 @@ + ) + { + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,29) ++ /* FIXME: No more `atomic' read and reset. Wonderful 8-( --RR */ + int reset = 0; + #endif + struct ip_chain *i; +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipfwadm_core.c src/linux/linux.stock/net/ipv4/netfilter/ipfwadm_core.c +--- src/linux/linux/net/ipv4/netfilter/ipfwadm_core.c 2003-10-14 04:09:33.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipfwadm_core.c 2004-05-09 04:13:03.000000000 -0400 +@@ -20,7 +20,7 @@ + * license in recognition of the original copyright. + * -- Alan Cox. + * +- * $Id: ipfwadm_core.c,v 1.1.1.4 2003/10/14 08:09:33 sparq Exp $ ++ * $Id: ipfwadm_core.c,v 1.9.2.2 2002/01/24 15:50:42 davem Exp $ + * + * Ported from BSD to Linux, + * Alan Cox 22/Nov/1994. +@@ -1205,6 +1205,7 @@ + ) + { + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,29) ++ /* FIXME: No more `atomic' read and reset. Wonderful 8-( --RR */ + int reset = 0; + #endif + return ip_chain_procinfo(IP_FW_ACCT, buffer,start, offset,length, +@@ -1223,6 +1224,7 @@ + ) + { + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,29) ++ /* FIXME: No more `atomic' read and reset. Wonderful 8-( --RR */ + int reset = 0; + #endif + return ip_chain_procinfo(IP_FW_IN, buffer,start,offset,length, +@@ -1237,6 +1239,7 @@ + ) + { + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,29) ++ /* FIXME: No more `atomic' read and reset. Wonderful 8-( --RR */ + int reset = 0; + #endif + return ip_chain_procinfo(IP_FW_OUT, buffer,start,offset,length, +@@ -1251,6 +1254,7 @@ + ) + { + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,29) ++ /* FIXME: No more `atomic' read and reset. Wonderful 8-( --RR */ + int reset = 0; + #endif + return ip_chain_procinfo(IP_FW_FWD, buffer,start,offset,length, +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipt_ECN.c src/linux/linux.stock/net/ipv4/netfilter/ipt_ECN.c +--- src/linux/linux/net/ipv4/netfilter/ipt_ECN.c 2003-10-14 04:02:57.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipt_ECN.c 2004-05-09 04:13:03.000000000 -0400 +@@ -87,8 +87,8 @@ + } + + if (diffs[0] != *tcpflags) { +- diffs[0] = diffs[0] ^ 0xFFFF; +- diffs[1] = *tcpflags; ++ diffs[0] = htons(diffs[0]) ^ 0xFFFF; ++ diffs[1] = htons(*tcpflags); + tcph->check = csum_fold(csum_partial((char *)diffs, + sizeof(diffs), + tcph->check^0xFFFF)); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipt_LOG.c src/linux/linux.stock/net/ipv4/netfilter/ipt_LOG.c +--- src/linux/linux/net/ipv4/netfilter/ipt_LOG.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipt_LOG.c 2004-05-09 04:13:03.000000000 -0400 +@@ -14,11 +14,15 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + struct esphdr { + __u32 spi; +-}; ++}; /* FIXME evil kludge */ + + /* Use lock to serialize, so printks don't overlap */ + static spinlock_t log_lock = SPIN_LOCK_UNLOCKED; +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipt_REJECT.c src/linux/linux.stock/net/ipv4/netfilter/ipt_REJECT.c +--- src/linux/linux/net/ipv4/netfilter/ipt_REJECT.c 2003-07-04 04:12:31.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipt_REJECT.c 2004-05-09 04:13:03.000000000 -0400 +@@ -6,8 +6,6 @@ + #include + #include + #include +-#include +-#include + #include + #include + #include +@@ -16,7 +14,11 @@ + #include + #include + ++#if 0 ++#define DEBUGP printk ++#else + #define DEBUGP(format, args...) ++#endif + + /* If the original packet is part of a connection, but the connection + is not confirmed, our manufactured reply will not be associated +@@ -155,7 +157,6 @@ + static void send_unreach(struct sk_buff *skb_in, int code) + { + struct iphdr *iph; +- struct udphdr *udph; + struct icmphdr *icmph; + struct sk_buff *nskb; + u32 saddr; +@@ -167,6 +168,7 @@ + if (!rt) + return; + ++ /* FIXME: Use sysctl number. --RR */ + if (!xrlim_allow(&rt->u.dst, 1*HZ)) + return; + +@@ -184,19 +186,6 @@ + if (iph->frag_off&htons(IP_OFFSET)) + return; + +- /* if UDP checksum is set, verify it's correct */ +- if (iph->protocol == IPPROTO_UDP +- && skb_in->tail-(u8*)iph >= sizeof(struct udphdr)) { +- int datalen = skb_in->len - (iph->ihl<<2); +- udph = (struct udphdr *)((char *)iph + (iph->ihl<<2)); +- if (udph->check +- && csum_tcpudp_magic(iph->saddr, iph->daddr, +- datalen, IPPROTO_UDP, +- csum_partial((char *)udph, datalen, +- 0)) != 0) +- return; +- } +- + /* If we send an ICMP error to an ICMP error a mess would result.. */ + if (iph->protocol == IPPROTO_ICMP + && skb_in->tail-(u8*)iph >= sizeof(struct icmphdr)) { +@@ -271,6 +260,7 @@ + /* Copy as much of original packet as will fit */ + data = skb_put(nskb, + length - sizeof(struct iphdr) - sizeof(struct icmphdr)); ++ /* FIXME: won't work with nonlinear skbs --RR */ + memcpy(data, skb_in->nh.iph, + length - sizeof(struct iphdr) - sizeof(struct icmphdr)); + icmph->checksum = ip_compute_csum((unsigned char *)icmph, +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipt_ULOG.c src/linux/linux.stock/net/ipv4/netfilter/ipt_ULOG.c +--- src/linux/linux/net/ipv4/netfilter/ipt_ULOG.c 2003-07-04 04:12:32.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipt_ULOG.c 2004-05-09 04:13:03.000000000 -0400 +@@ -12,7 +12,6 @@ + * module loadtime -HW + * 2002/07/07 remove broken nflog_rcv() function -HW + * 2002/08/29 fix shifted/unshifted nlgroup bug -HW +- * 2002/10/30 fix uninitialized mac_len field - + * + * Released under the terms of the GPL + * +@@ -32,7 +31,7 @@ + * Specify, after how many clock ticks (intel: 100 per second) the queue + * should be flushed even if it is not full yet. + * +- * ipt_ULOG.c,v 1.22 2002/10/30 09:07:31 laforge Exp ++ * ipt_ULOG.c,v 1.21 2002/08/29 10:54:34 laforge Exp + */ + + #include +@@ -60,7 +59,12 @@ + #define ULOG_NL_EVENT 111 /* Harald's favorite number */ + #define ULOG_MAXNLGROUPS 32 /* numer of nlgroups */ + ++#if 0 ++#define DEBUGP(format, args...) printk(__FILE__ ":" __FUNCTION__ ":" \ ++ format, ## args) ++#else + #define DEBUGP(format, args...) ++#endif + + #define PRINTR(format, args...) do { if (net_ratelimit()) printk(format, ## args); } while (0) + +@@ -220,8 +224,7 @@ + && in->hard_header_len <= ULOG_MAC_LEN) { + memcpy(pm->mac, (*pskb)->mac.raw, in->hard_header_len); + pm->mac_len = in->hard_header_len; +- } else +- pm->mac_len = 0; ++ } + + if (in) + strncpy(pm->indev_name, in->name, sizeof(pm->indev_name)); +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipt_multiport.c src/linux/linux.stock/net/ipv4/netfilter/ipt_multiport.c +--- src/linux/linux/net/ipv4/netfilter/ipt_multiport.c 2003-07-04 04:12:32.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipt_multiport.c 2004-05-09 04:13:03.000000000 -0400 +@@ -8,7 +8,11 @@ + #include + #include + ++#if 0 ++#define duprintf(format, args...) printk(format , ## args) ++#else + #define duprintf(format, args...) ++#endif + + /* Returns 1 if the port is matched by the test, 0 otherwise. */ + static inline int +@@ -74,7 +78,7 @@ + + /* Must specify proto == TCP/UDP, no unknown flags or bad count */ + return (ip->proto == IPPROTO_TCP || ip->proto == IPPROTO_UDP) +- && !(ip->invflags & IPT_INV_PROTO) ++ && !(ip->flags & IPT_INV_PROTO) + && matchsize == IPT_ALIGN(sizeof(struct ipt_multiport)) + && (multiinfo->flags == IPT_MULTIPORT_SOURCE + || multiinfo->flags == IPT_MULTIPORT_DESTINATION +diff -Nurb src/linux/linux/net/ipv4/netfilter/ipt_pool.c src/linux/linux.stock/net/ipv4/netfilter/ipt_pool.c +--- src/linux/linux/net/ipv4/netfilter/ipt_pool.c 2003-07-04 04:12:32.000000000 -0400 ++++ src/linux/linux.stock/net/ipv4/netfilter/ipt_pool.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,71 +0,0 @@ +-/* Kernel module to match an IP address pool. */ +- +-#include +-#include +-#include +- +-#include +-#include +-#include +- +-static inline int match_pool( +- ip_pool_t index, +- __u32 addr, +- int inv +-) { +- if (ip_pool_match(index, ntohl(addr))) +- inv = !inv; +- return inv; +-} +- +-static int match( +- const struct sk_buff *skb, +- const struct net_device *in, +- const struct net_device *out, +- const void *matchinfo, +- int offset, +- const void *hdr, +- u_int16_t datalen, +- int *hotdrop +-) { +- const struct ipt_pool_info *info = matchinfo; +- const struct iphdr *iph = skb->nh.iph; +- +- if (info->src != IP_POOL_NONE && !match_pool(info->src, iph->saddr, +- info->flags&IPT_POOL_INV_SRC)) +- return 0; +- +- if (info->dst != IP_POOL_NONE && !match_pool(info->dst, iph->daddr, +- info->flags&IPT_POOL_INV_DST)) +- return 0; +- +- return 1; +-} +- +-static int checkentry( +- const char *tablename, +- const struct ipt_ip *ip, +- void *matchinfo, +- unsigned int matchsize, +- unsigned int hook_mask +-) { +- if (matchsize != IPT_ALIGN(sizeof(struct ipt_pool_info))) +- return 0; +- return 1; +-} +- +-static struct ipt_match pool_match +-= { { NULL, NULL }, "pool", &match, &checkentry, NULL, THIS_MODULE }; +- +-static int __init init(void) +-{ +- return ipt_register_match(&pool_match); +-} +- +-static void __exit fini(void) +-{ +- ipt_unregister_match(&pool_match); +-} +- +-module_init(init); +-module_exit(fini); +diff -Nurb src/linux/linux/net/ipv6/mcast.c src/linux/linux.stock/net/ipv6/mcast.c +--- src/linux/linux/net/ipv6/mcast.c 2003-10-14 04:09:34.000000000 -0400 ++++ src/linux/linux.stock/net/ipv6/mcast.c 2004-05-09 04:13:22.000000000 -0400 +@@ -5,7 +5,7 @@ + * Authors: + * Pedro Roque + * +- * $Id: mcast.c,v 1.1.1.4 2003/10/14 08:09:34 sparq Exp $ ++ * $Id: mcast.c,v 1.38 2001/08/15 07:36:31 davem Exp $ + * + * Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c + * diff --git a/obsolete-buildroot/sources/openwrt-wrt54g-linux.config b/obsolete-buildroot/sources/openwrt-wrt54g-linux.config new file mode 100644 index 0000000000..20256a05e6 --- /dev/null +++ b/obsolete-buildroot/sources/openwrt-wrt54g-linux.config @@ -0,0 +1,843 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MIPS=y +CONFIG_MIPS32=y +# CONFIG_MIPS64 is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# Machine selection +# +# CONFIG_ACER_PICA_61 is not set +# CONFIG_MIPS_DB1000 is not set +# CONFIG_MIPS_DB1100 is not set +# CONFIG_MIPS_DB1500 is not set +# CONFIG_MIPS_PB1000 is not set +# CONFIG_MIPS_PB1100 is not set +# CONFIG_MIPS_PB1500 is not set +# CONFIG_BAGET_MIPS is not set +# CONFIG_CASIO_E55 is not set +# CONFIG_MIPS_COBALT is not set +# CONFIG_DECSTATION is not set +# CONFIG_MIPS_EV64120 is not set +# CONFIG_MIPS_EV96100 is not set +# CONFIG_MIPS_IVR is not set +# CONFIG_HP_LASERJET is not set +# CONFIG_IBM_WORKPAD is not set +# CONFIG_LASAT is not set +# CONFIG_MIPS_ITE8172 is not set +# CONFIG_MIPS_ATLAS is not set +# CONFIG_MIPS_MAGNUM_4000 is not set +# CONFIG_MIPS_MALTA is not set +# CONFIG_MIPS_SEAD is not set +# CONFIG_MOMENCO_OCELOT is not set +# CONFIG_MOMENCO_OCELOT_G is not set +# CONFIG_DDB5074 is not set +# CONFIG_DDB5476 is not set +# CONFIG_DDB5477 is not set +# CONFIG_NEC_OSPREY is not set +# CONFIG_NEC_EAGLE is not set +# CONFIG_OLIVETTI_M700 is not set +# CONFIG_NINO is not set +# CONFIG_SGI_IP22 is not set +# CONFIG_SGI_IP27 is not set +# CONFIG_SGI_IP32 is not set +# CONFIG_SIBYTE_SB1xxx_SOC is not set +CONFIG_MIPS_BRCM=y +CONFIG_BCM947XX=y +CONFIG_BCM4710=y +CONFIG_BCM4310=y +CONFIG_BCM4704=y +# CONFIG_BCM5365 is not set +# CONFIG_SNI_RM200_PCI is not set +# CONFIG_TOSHIBA_JMR3927 is not set +# CONFIG_VICTOR_MPC30X is not set +# CONFIG_ZAO_CAPCELLA is not set +# CONFIG_HIGHMEM is not set +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs init=/etc/preinit noinitrd console=ttyS0,115200" +CONFIG_PCI=y +CONFIG_NONCOHERENT_IO=y +CONFIG_NEW_TIME_C=y +CONFIG_NEW_IRQ=y +CONFIG_HND=y +# CONFIG_MIPS_AU1000 is not set + +# +# CPU selection +# +CONFIG_CPU_MIPS32=y +# CONFIG_CPU_MIPS64 is not set +# CONFIG_CPU_R3000 is not set +# CONFIG_CPU_TX39XX is not set +# CONFIG_CPU_VR41XX is not set +# CONFIG_CPU_R4300 is not set +# CONFIG_CPU_R4X00 is not set +# CONFIG_CPU_TX49XX is not set +# CONFIG_CPU_R5000 is not set +# CONFIG_CPU_R5432 is not set +# CONFIG_CPU_R6000 is not set +# CONFIG_CPU_NEVADA is not set +# CONFIG_CPU_R8000 is not set +# CONFIG_CPU_R10000 is not set +# CONFIG_CPU_RM7000 is not set +# CONFIG_CPU_SB1 is not set +CONFIG_CPU_HAS_PREFETCH=y +# CONFIG_VTAG_ICACHE is not set +# CONFIG_64BIT_PHYS_ADDR is not set +# CONFIG_CPU_ADVANCED is not set +CONFIG_CPU_HAS_LLSC=y +# CONFIG_CPU_HAS_LLDSCD is not set +# CONFIG_CPU_HAS_WB is not set +CONFIG_CPU_HAS_SYNC=y + +# +# General setup +# +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_NET=y +# CONFIG_PCI_NAMES is not set +# CONFIG_ISA is not set +# CONFIG_EISA is not set +# CONFIG_TC is not set +# CONFIG_MCA is not set +# CONFIG_SBUS is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +# CONFIG_PCMCIA is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set +# CONFIG_HOTPLUG_PCI_COMPAQ is not set +# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set +# CONFIG_HOTPLUG_PCI_ACPI is not set +# CONFIG_SYSVIPC is not set +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +# CONFIG_PRINT_SYSCALLS is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_MIPS32_COMPAT is not set +# CONFIG_MIPS32_O32 is not set +# CONFIG_MIPS32_N32 is not set +# CONFIG_BINFMT_ELF32 is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_CONCAT is not set +# CONFIG_MTD_REDBOOT_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLOCK is not set +CONFIG_MTD_BLOCK_RO=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_B1 is not set +CONFIG_MTD_CFI_B2=y +# CONFIG_MTD_CFI_B4 is not set +CONFIG_MTD_CFI_I1=y +# CONFIG_MTD_CFI_I2 is not set +# CONFIG_MTD_CFI_I4 is not set +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_SSTSTD=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set +# CONFIG_MTD_JEDEC is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_BCM947XX=y +# CONFIG_MTD_PB1000 is not set +# CONFIG_MTD_PB1500 is not set +# CONFIG_MTD_PB1100 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_LASAT is not set +# CONFIG_MTD_PCI is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_SFLASH=y +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_MSYS is not set +# CONFIG_NOROOT is not set +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NBD=m +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set +# CONFIG_BLK_STATS is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +# CONFIG_IP_ROUTE_MULTIPATH is not set +CONFIG_IP_ROUTE_TOS=y +# CONFIG_IP_ROUTE_VERBOSE is not set +# CONFIG_IP_ROUTE_LARGE_TABLES is not set +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=y +CONFIG_IP_NF_FTP=y +CONFIG_IP_NF_H323=y +CONFIG_IP_NF_CONNTRACK_MARK=y +# CONFIG_IP_NF_AMANDA is not set +CONFIG_IP_NF_TFTP=y +CONFIG_IP_NF_IRC=y +CONFIG_IP_NF_CT_PROTO_GRE=y +CONFIG_IP_NF_PPTP=y +CONFIG_IP_NF_MMS=y +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_SET=m +CONFIG_IP_NF_SET_MAX=256 +CONFIG_IP_NF_SET_IPMAP=m +CONFIG_IP_NF_SET_PORTMAP=m +CONFIG_IP_NF_SET_MACIPMAP=m +CONFIG_IP_NF_SET_IPHASH=m +CONFIG_IP_NF_MATCH_QUOTA=m +CONFIG_IP_NF_POOL=m +CONFIG_IP_POOL_STATISTICS=y +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_DSTLIMIT=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=y +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_CONDITION=m +# CONFIG_IP_NF_MATCH_RANDOM is not set +CONFIG_IP_NF_MATCH_PSD=m +# CONFIG_IP_NF_MATCH_OSF is not set +# CONFIG_IP_NF_MATCH_NTH is not set +CONFIG_IP_NF_MATCH_IPV4OPTIONS=m +# CONFIG_IP_NF_MATCH_FUZZY is not set +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +# CONFIG_IP_NF_MATCH_U32 is not set +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=y +# CONFIG_IP_NF_MATCH_REALM is not set +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=y +CONFIG_IP_NF_MATCH_CONNMARK=m +CONFIG_IP_NF_MATCH_CONNLIMIT=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_UNCLEAN=m +CONFIG_IP_NF_MATCH_STRING=m +# CONFIG_IP_NF_MATCH_OWNER is not set +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_TARGET_NETLINK=m +CONFIG_IP_NF_TARGET_IPV4OPTSSTRIP=m +CONFIG_IP_NF_TARGET_MIRROR=m +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_NAT_H323=y +# CONFIG_IP_NF_TARGET_SAME is not set +# CONFIG_IP_NF_TARGET_NETMAP is not set +CONFIG_IP_NF_NAT_PPTP=y +CONFIG_IP_NF_NAT_PROTO_GRE=y +# CONFIG_IP_NF_NAT_LOCAL is not set +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=y +CONFIG_IP_NF_NAT_MMS=y +CONFIG_IP_NF_NAT_FTP=y +CONFIG_IP_NF_NAT_TFTP=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=y +CONFIG_IP_NF_TARGET_IPMARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=y +CONFIG_IP_NF_TARGET_CONNMARK=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=y +# CONFIG_IP_NF_RAW is not set +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IPV6=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +# CONFIG_IP6_NF_MATCH_RANDOM is not set +# CONFIG_IP6_NF_MATCH_NTH is not set +# CONFIG_IP6_NF_MATCH_FUZZY is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_HL is not set +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set +# CONFIG_IP6_NF_MATCH_AHESP is not set +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +# CONFIG_IP6_NF_TARGET_HL is not set +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +CONFIG_VLAN_8021Q=y + +# +# +# +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +CONFIG_BRIDGE=y +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +CONFIG_WAN_ROUTER=m +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_CSZ=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set +# CONFIG_PHONE_IXJ is not set +# CONFIG_PHONE_IXJ_PCMCIA is not set + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_PCI is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# Broadcom HND network devices +# +CONFIG_HND=y +# CONFIG_IL is not set +CONFIG_ET=m +# CONFIG_ET_4413 is not set +CONFIG_ET_47XX=y +CONFIG_WL=m +CONFIG_WL_AP=y +CONFIG_WL_STA=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=y +# CONFIG_PPP_SYNC_TTY is not set +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPPOE=m +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y +# CONFIG_STRIP is not set +# CONFIG_WAVELAN is not set +# CONFIG_ARLAN is not set +# CONFIG_AIRONET4500 is not set +# CONFIG_AIRONET4500_NONCS is not set +# CONFIG_AIRONET4500_PROC is not set +# CONFIG_AIRO is not set +# CONFIG_HERMES is not set +# CONFIG_PLX_HERMES is not set +# CONFIG_PCI_HERMES is not set +CONFIG_NET_WIRELESS=y + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +CONFIG_SHAPER=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=128 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# + +# +# Input core support is needed for joysticks +# +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y +# CONFIG_ACQUIRE_WDT is not set +# CONFIG_ADVANTECH_WDT is not set +# CONFIG_ALIM7101_WDT is not set +# CONFIG_SC520_WDT is not set +# CONFIG_PCWATCHDOG is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +# CONFIG_WAFER_WDT is not set +# CONFIG_I810_TCO is not set +# CONFIG_MIXCOMWD is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SC1200_WDT is not set +CONFIG_SOFT_WATCHDOG=y +# CONFIG_W83877F_WDT is not set +# CONFIG_WDT is not set +# CONFIG_WDTPCI is not set +# CONFIG_MACHZ_WDT is not set +# CONFIG_INDYDOG is not set +# CONFIG_AMD7XX_TCO is not set +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +# CONFIG_FAT_FS is not set +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +CONFIG_DEVFS_FS=y +CONFIG_DEVFS_MOUNT=y +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_EXT2_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_SUNRPC=m +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +# CONFIG_MSDOS_PARTITION is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Support for USB gadgets +# +# CONFIG_USB_GADGET is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +CONFIG_CROSSCOMPILE=y +# CONFIG_KERNPROF is not set +# CONFIG_MCOUNT is not set +# CONFIG_DEBUG is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_MIPS_UNCACHED is not set +# CONFIG_KTRACE is not set +# CONFIG_HWSIM is not set + +# +# Library routines +# +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y diff --git a/obsolete-buildroot/sources/openwrt-wrt54g-linux.patch b/obsolete-buildroot/sources/openwrt-wrt54g-linux.patch new file mode 100644 index 0000000000..67223f0128 --- /dev/null +++ b/obsolete-buildroot/sources/openwrt-wrt54g-linux.patch @@ -0,0 +1,1791 @@ +diff -urN src/linux-dist/linux/Makefile src/linux/linux/Makefile +--- src/linux-dist/linux/Makefile 2003-10-14 03:00:10.000000000 -0500 ++++ src/linux/linux/Makefile 2004-03-29 17:00:53.000000000 -0600 +@@ -17,7 +17,7 @@ + FINDHPATH = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net $(HPATH)/math-emu + + HOSTCC = gcc +-HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer ++HOSTCFLAGS = -Wall -Wstrict-prototypes -Os -fomit-frame-pointer + + CROSS_COMPILE = + +@@ -88,7 +88,7 @@ + + CPPFLAGS := -D__KERNEL__ -I$(HPATH) + +-CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \ ++CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -Os \ + -fno-strict-aliasing -fno-common + + # Turn on -pg to instrument the kernel with calls to mcount(). +diff -urN src/linux-dist/linux/arch/mips/brcm-boards/bcm947xx/setup.c src/linux/linux/arch/mips/brcm-boards/bcm947xx/setup.c +--- src/linux-dist/linux/arch/mips/brcm-boards/bcm947xx/setup.c 2003-11-11 08:08:46.000000000 -0600 ++++ src/linux/linux/arch/mips/brcm-boards/bcm947xx/setup.c 2004-03-29 17:00:53.000000000 -0600 +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #endif + + #include +@@ -160,37 +161,38 @@ + #ifdef CONFIG_MTD_PARTITIONS + + static struct mtd_partition bcm947xx_parts[] = { +- { name: "pmon", offset: 0, size: 0, /*mask_flags: MTD_WRITEABLE,*/ }, ++ { name: "pmon", offset: 0, size: 0, mask_flags: MTD_WRITEABLE, }, + { name: "linux", offset: 0, size: 0, }, + { name: "rootfs", offset: 0, size: 0, /*mask_flags: MTD_WRITEABLE,*/ }, + { name: "nvram", offset: 0, size: 0, }, ++ { name: "OpenWrt", offset: 0, size: 0, }, + { name: NULL, }, + }; + +-struct mtd_partition * __init +-init_mtd_partitions(struct mtd_info *mtd, size_t size) ++ ++static int __init ++find_root(struct mtd_info *mtd, size_t size, struct mtd_partition *part) + { +- struct minix_super_block *minixsb; +- struct ext2_super_block *ext2sb; +- struct romfs_super_block *romfsb; + struct cramfs_super *cramfsb; ++ struct squashfs_super_block *squashfsb; + struct trx_header *trx; ++ + unsigned char buf[512]; + int off; + size_t len; + +- minixsb = (struct minix_super_block *) buf; +- ext2sb = (struct ext2_super_block *) buf; +- romfsb = (struct romfs_super_block *) buf; + cramfsb = (struct cramfs_super *) buf; ++ squashfsb = (struct squashfs_super_block *) buf; + trx = (struct trx_header *) buf; + +- /* Look at every 64 KB boundary */ +- for (off = 0; off < size; off += (64 * 1024)) { ++ part->offset = 0; ++ part->size = 0; ++ ++ for (off = 0; off < size; off += mtd->erasesize) { + memset(buf, 0xe5, sizeof(buf)); + + /* +- * Read block 0 to test for romfs and cramfs superblock ++ * Read block 0 to test for cramfs superblock + */ + if (MTD_READ(mtd, off, sizeof(buf), &len, buf) || + len != sizeof(buf)) +@@ -198,75 +200,105 @@ + + /* Try looking at TRX header for rootfs offset */ + if (le32_to_cpu(trx->magic) == TRX_MAGIC) { +- bcm947xx_parts[1].offset = off; + if (le32_to_cpu(trx->offsets[1]) > off) + off = le32_to_cpu(trx->offsets[1]); + continue; + } + +- /* romfs is at block zero too */ +- if (romfsb->word0 == ROMSB_WORD0 && +- romfsb->word1 == ROMSB_WORD1) { +- printk(KERN_NOTICE +- "%s: romfs filesystem found at block %d\n", +- mtd->name, off / BLOCK_SIZE); +- goto done; +- } +- +- /* so is cramfs */ ++ /* need to find cramfs */ + if (cramfsb->magic == CRAMFS_MAGIC) { + printk(KERN_NOTICE + "%s: cramfs filesystem found at block %d\n", + mtd->name, off / BLOCK_SIZE); +- goto done; +- } +- +- /* +- * Read block 1 to test for minix and ext2 superblock +- */ +- if (MTD_READ(mtd, off + BLOCK_SIZE, sizeof(buf), &len, buf) || +- len != sizeof(buf)) +- continue; + +- /* Try minix */ +- if (minixsb->s_magic == MINIX_SUPER_MAGIC || +- minixsb->s_magic == MINIX_SUPER_MAGIC2) { +- printk(KERN_NOTICE +- "%s: Minix filesystem found at block %d\n", +- mtd->name, off / BLOCK_SIZE); ++ part->size = cramfsb->size; + goto done; + } + +- /* Try ext2 */ +- if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) { ++ /* or squashfs */ ++ if (squashfsb->s_magic == SQUASHFS_MAGIC) { + printk(KERN_NOTICE +- "%s: ext2 filesystem found at block %d\n", ++ "%s: squashfs filesystem found at block %d\n", + mtd->name, off / BLOCK_SIZE); ++ part->size = squashfsb->bytes_used+2048; + goto done; + } +- } + ++ } + printk(KERN_NOTICE +- "%s: Couldn't find valid ROM disk image\n", ++ "%s: Couldn't find valid cramfs image\n", + mtd->name); ++ return -1; ++ ++done: ++ part->offset = off; ++ return 0; ++} ++ ++ ++struct mtd_partition * __init ++init_mtd_partitions(struct mtd_info *mtd, size_t size) ++{ ++ ++ bcm947xx_parts[0].offset=0; ++ bcm947xx_parts[0].size=256*1024; + +- done: + /* Find and size nvram */ + bcm947xx_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); + bcm947xx_parts[3].size = size - bcm947xx_parts[3].offset; + + /* Find and size rootfs */ +- if (off < size) { +- bcm947xx_parts[2].offset = off; +- bcm947xx_parts[2].size = bcm947xx_parts[3].offset - bcm947xx_parts[2].offset; +- } ++ //if (off < size) { ++ // bcm947xx_parts[2].offset = off; ++ // bcm947xx_parts[2].size = bcm947xx_parts[3].offset - bcm947xx_parts[2].offset; ++ //} ++ ++ /* Find and size rootfs */ ++ find_root(mtd,size,&bcm947xx_parts[2]); ++ ++ + + /* Size linux (kernel and rootfs) */ ++ bcm947xx_parts[1].offset = bcm947xx_parts[0].size; + bcm947xx_parts[1].size = bcm947xx_parts[3].offset - bcm947xx_parts[1].offset; + ++ ++ ++ /* calculate leftover flash, and assign it to the jffs partition */ ++ size_t spot; ++ size_t len; ++ size_t mask; ++ // get the offset to the end of the root_fs ++ spot=bcm947xx_parts[2].offset+bcm947xx_parts[2].size; ++ // round it up to an erase size boundary ++ spot+=mtd->erasesize-1; ++ // mask the number to the boundary ++ mask=mtd->erasesize; ++ mask=mask-1; ++ mask=mask^0xffffffff; ++ spot&=mask; ++ // length = flashsize - start position - nvram size ++ len=size-spot; ++ len=len-bcm947xx_parts[3].size; ++ ++ ++ bcm947xx_parts[4].offset = spot; ++ bcm947xx_parts[4].size = len; ++ ++ ++ ++ + /* Size pmon */ + bcm947xx_parts[0].size = bcm947xx_parts[1].offset - bcm947xx_parts[0].offset; + ++ //int x; ++ //for(x=0; x<5; x++) { ++ // printk(KERN_NOTICE ++ // "Partition %d mask_flags %08x\n", ++ // x,bcm947xx_parts[x].mask_flags); ++ //} ++ ++ + return bcm947xx_parts; + } + +diff -urN src/linux-dist/linux/drivers/mtd/maps/bcm947xx-flash.c src/linux/linux/drivers/mtd/maps/bcm947xx-flash.c +--- src/linux-dist/linux/drivers/mtd/maps/bcm947xx-flash.c 2003-11-08 03:35:52.000000000 -0600 ++++ src/linux/linux/drivers/mtd/maps/bcm947xx-flash.c 2004-03-29 17:00:53.000000000 -0600 +@@ -82,7 +82,21 @@ + + void bcm947xx_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len) + { ++ //memcpy_fromio(to, map->map_priv_1 + from, len); ++ if (len==1) { + memcpy_fromio(to, map->map_priv_1 + from, len); ++ } else { ++ int i; ++ u16 *dest = (u16 *) to; ++ u16 *src = (u16 *) (map->map_priv_1 + from); ++ ++ for (i = 0; i < (len / 2); i++) { ++ dest[i] = src[i]; ++ } ++ ++ if (len & 1) ++ *((u8 *)dest+len-1) = src[i] & 0xff; ++ } + } + + void bcm947xx_map_write8(struct map_info *map, __u8 d, unsigned long adr) +diff -urN src/linux-dist/linux/drivers/net/Makefile src/linux/linux/drivers/net/Makefile +--- src/linux-dist/linux/drivers/net/Makefile 2004-02-12 20:35:15.000000000 -0600 ++++ src/linux/linux/drivers/net/Makefile 2004-03-29 17:00:53.000000000 -0600 +@@ -25,7 +25,7 @@ + list-multi := rcpci.o + rcpci-objs := rcpci45.o rclanmtl.o + +-subdir-m += mac ++# subdir-m += mac + subdir-m += diag + + ifeq ($(CONFIG_HW_QOS),y) +diff -urN src/linux-dist/linux/fs/Config.in src/linux/linux/fs/Config.in +--- src/linux-dist/linux/fs/Config.in 2003-07-04 03:12:05.000000000 -0500 ++++ src/linux/linux/fs/Config.in 2004-03-29 17:00:53.000000000 -0600 +@@ -47,6 +47,7 @@ + int 'JFFS2 debugging verbosity (0 = quiet, 2 = noisy)' CONFIG_JFFS2_FS_DEBUG 0 + fi + tristate 'Compressed ROM file system support' CONFIG_CRAMFS ++tristate 'Squashed file system support' CONFIG_SQUASHFS + bool 'Virtual memory file system support (former shm fs)' CONFIG_TMPFS + define_bool CONFIG_RAMFS y + +diff -urN src/linux-dist/linux/fs/Makefile src/linux/linux/fs/Makefile +--- src/linux-dist/linux/fs/Makefile 2003-07-04 03:12:05.000000000 -0500 ++++ src/linux/linux/fs/Makefile 2004-03-29 17:00:53.000000000 -0600 +@@ -68,6 +68,7 @@ + subdir-$(CONFIG_SUN_OPENPROMFS) += openpromfs + subdir-$(CONFIG_BEFS_FS) += befs + subdir-$(CONFIG_JFS_FS) += jfs ++subdir-$(CONFIG_SQUASHFS) += squashfs + + + obj-$(CONFIG_BINFMT_AOUT) += binfmt_aout.o +diff -urN src/linux-dist/linux/fs/squashfs/Makefile src/linux/linux/fs/squashfs/Makefile +--- src/linux-dist/linux/fs/squashfs/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ src/linux/linux/fs/squashfs/Makefile 2004-03-29 17:00:53.000000000 -0600 +@@ -0,0 +1,11 @@ ++# ++# Makefile for the linux squashfs routines. ++# ++ ++O_TARGET := squashfs.o ++ ++obj-y := inode.o ++ ++obj-m := $(O_TARGET) ++ ++include $(TOPDIR)/Rules.make +diff -urN src/linux-dist/linux/fs/squashfs/inode.c src/linux/linux/fs/squashfs/inode.c +--- src/linux-dist/linux/fs/squashfs/inode.c 1969-12-31 18:00:00.000000000 -0600 ++++ src/linux/linux/fs/squashfs/inode.c 2004-03-29 17:00:53.000000000 -0600 +@@ -0,0 +1,972 @@ ++/* ++ * Squashfs - a compressed read only filesystem for Linux ++ * ++ * Copyright (c) 2002 Phillip Lougher ++ * ++ * 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. ++ * ++ * inode.c ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#ifdef SQUASHFS_TRACE ++#define TRACE(s, args...) printk(KERN_NOTICE "SQUASHFS: "s, ## args) ++#else ++#define TRACE(s, args...) {} ++#endif ++ ++#define ERROR(s, args...) printk(KERN_ERR "SQUASHFS error: "s, ## args) ++ ++#define SERROR(s, args...) if(!silent) printk(KERN_ERR "SQUASHFS error: "s, ## args) ++#define WARNING(s, args...) printk(KERN_WARNING "SQUASHFS: "s, ## args) ++ ++static struct super_block *squashfs_read_super(struct super_block *, void *, int); ++static void squashfs_put_super(struct super_block *); ++static int squashfs_statfs(struct super_block *, struct statfs *); ++static int squashfs_symlink_readpage(struct file *file, struct page *page); ++static int squashfs_readpage(struct file *file, struct page *page); ++static int squashfs_readdir(struct file *, void *, filldir_t); ++static struct dentry *squashfs_lookup(struct inode *, struct dentry *); ++static unsigned int read_data(struct super_block *s, char *buffer, ++ unsigned int index, int length, unsigned int *next_index); ++static int squashfs_get_cached_block(struct super_block *s, char *buffer, ++ unsigned int block, unsigned int offset, int length, ++ unsigned int *next_block, unsigned int *next_offset); ++static struct inode *squashfs_iget(struct super_block *s, squashfs_inode inode); ++static void squashfs_put_super(struct super_block *s); ++ ++DECLARE_MUTEX(read_data_mutex); ++ ++static z_stream stream; ++ ++static DECLARE_FSTYPE_DEV(squashfs_fs_type, "squashfs", squashfs_read_super); ++ ++static unsigned char squashfs_filetype_table[] = { ++ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK ++}; ++ ++static struct super_operations squashfs_ops = { ++ statfs: squashfs_statfs, ++ put_super: squashfs_put_super, ++}; ++ ++static struct address_space_operations squashfs_symlink_aops = { ++ readpage: squashfs_symlink_readpage ++}; ++ ++static struct address_space_operations squashfs_aops = { ++ readpage: squashfs_readpage ++}; ++ ++static struct file_operations squashfs_dir_ops = { ++ read: generic_read_dir, ++ readdir: squashfs_readdir ++}; ++ ++static struct inode_operations squashfs_dir_inode_ops = { ++ lookup: squashfs_lookup ++}; ++ ++ ++static unsigned int read_data(struct super_block *s, char *buffer, ++ unsigned int index, int length, unsigned int *next_index) ++{ ++ squashfs_sb_info *msBlk = &s->u.squashfs_sb; ++ struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >> msBlk->devblksize_log2) + 2]; ++ unsigned short c_byte; ++ unsigned int offset = index & ((1 << msBlk->devblksize_log2) - 1); ++ unsigned int cur_index = index >> msBlk->devblksize_log2; ++ int bytes, avail_bytes, b, k; ++ char *c_buffer; ++ unsigned int compressed; ++ ++ if(!(bh[0] = sb_bread(s, cur_index))) ++ goto read_failure; ++ ++ if(length) ++ c_byte = length; ++ else { ++ if(msBlk->devblksize - offset == 1) { ++ if(msBlk->swap) ++ ((unsigned char *) &c_byte)[1] = *((unsigned char *) (bh[0]->b_data + offset)); ++ else ++ ((unsigned char *) &c_byte)[0] = *((unsigned char *) (bh[0]->b_data + offset)); ++ brelse(bh[0]); ++ if(!(bh[0] = sb_bread(s, ++cur_index))) ++ goto read_failure; ++ if(msBlk->swap) ++ ((unsigned char *) &c_byte)[0] = *((unsigned char *) bh[0]->b_data); ++ else ++ ((unsigned char *) &c_byte)[1] = *((unsigned char *) bh[0]->b_data); ++ offset = 1; ++ } ++ else { ++ if(msBlk->swap) { ++ ((unsigned char *) &c_byte)[1] = *((unsigned char *) (bh[0]->b_data + offset)); ++ ((unsigned char *) &c_byte)[0] = *((unsigned char *) (bh[0]->b_data + offset + 1)); ++ } else ++ c_byte = *((unsigned short *) (bh[0]->b_data + offset)); ++ offset += 2; ++ } ++ if(SQUASHFS_CHECK_DATA(msBlk->sBlk.flags)) { ++ if(offset == msBlk->devblksize) { ++ brelse(bh[0]); ++ if(!(bh[0] = sb_bread(s, ++cur_index))) ++ goto read_failure; ++ offset = 0; ++ } ++ if(*((unsigned char *) (bh[0]->b_data + offset)) != SQUASHFS_MARKER_BYTE) { ++ ERROR("Metadata block marker corrupt @ %x\n", index); ++ brelse(bh[0]); ++ return 0; ++ } ++ offset ++; ++ } ++ } ++ ++ bytes = msBlk->devblksize - offset; ++ c_buffer = (compressed = SQUASHFS_COMPRESSED(c_byte)) ? msBlk->read_data : buffer; ++ c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte); ++ ++ TRACE("Block @ 0x%x, %scompressed size %d\n", index, compressed ? "" : "un", (unsigned int) c_byte); ++ ++ for(b = 1; bytes < c_byte; b++) { ++ if(!(bh[b] = sb_bread(s, ++cur_index))) ++ goto block_release; ++ bytes += msBlk->devblksize; ++ } ++ ++ if(compressed) ++ down(&read_data_mutex); ++ ++ for(bytes = 0, k = 0; k < b; k++) { ++ avail_bytes = (c_byte - bytes) > (msBlk->devblksize - offset) ? msBlk->devblksize - offset : c_byte - bytes; ++ memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes); ++ bytes += avail_bytes; ++ offset = 0; ++ brelse(bh[k]); ++ } ++ ++ /* ++ * uncompress block ++ */ ++ if(compressed) { ++ int zlib_err; ++ ++ stream.next_in = c_buffer; ++ stream.avail_in = c_byte; ++ stream.next_out = buffer; ++ stream.avail_out = msBlk->read_size; ++ if(((zlib_err = zlib_inflateInit(&stream)) != Z_OK) || ++ ((zlib_err = zlib_inflate(&stream, Z_FINISH)) != Z_STREAM_END) || ++ ((zlib_err = zlib_inflateEnd(&stream)) != Z_OK)) { ++ ERROR("zlib_fs returned unexpected result 0x%x\n", zlib_err); ++ bytes = 0; ++ } else ++ bytes = stream.total_out; ++ up(&read_data_mutex); ++ } ++ ++ if(next_index) ++ *next_index = index + c_byte + (length ? 0 : (SQUASHFS_CHECK_DATA(msBlk->sBlk.flags) ? 3 : 2)); ++ ++ return bytes; ++ ++block_release: ++ while(--b >= 0) brelse(bh[b]); ++ ++read_failure: ++ ERROR("sb_bread failed reading block 0x%x\n", cur_index); ++ return 0; ++} ++ ++ ++static int squashfs_get_cached_block(struct super_block *s, char *buffer, ++ unsigned int block, unsigned int offset, int length, ++ unsigned int *next_block, unsigned int *next_offset) ++{ ++ squashfs_sb_info *msBlk = &s->u.squashfs_sb; ++ int n, i, bytes, return_length = length; ++ unsigned int next_index; ++ ++ TRACE("Entered squashfs_get_cached_block [%x:%x]\n", block, offset); ++ ++ for(;;) { ++ for(i = 0; i < SQUASHFS_CACHED_BLKS; i++) ++ if(msBlk->block_cache[i].block == block) ++ break; ++ ++ down(&msBlk->block_cache_mutex); ++ if(i == SQUASHFS_CACHED_BLKS) { ++ /* read inode header block */ ++ for(i = msBlk->next_cache, n = SQUASHFS_CACHED_BLKS; n ; n --, i = (i + 1) % SQUASHFS_CACHED_BLKS) ++ if(msBlk->block_cache[i].block != SQUASHFS_USED_BLK) ++ break; ++ if(n == 0) { ++ up(&msBlk->block_cache_mutex); ++ sleep_on(&msBlk->waitq); ++ continue; ++ } ++ msBlk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS; ++ ++ if(msBlk->block_cache[i].block == SQUASHFS_INVALID_BLK) { ++ if(!(msBlk->block_cache[i].data = (unsigned char *) ++ kmalloc(SQUASHFS_METADATA_SIZE, GFP_KERNEL))) { ++ ERROR("Failed to allocate cache block\n"); ++ up(&msBlk->block_cache_mutex); ++ return 0; ++ } ++ } ++ ++ msBlk->block_cache[i].block = SQUASHFS_USED_BLK; ++ up(&msBlk->block_cache_mutex); ++ if(!(msBlk->block_cache[i].length = read_data(s, msBlk->block_cache[i].data, block, 0, ++ &next_index))) { ++ ERROR("Unable to read cache block [%x:%x]\n", block, offset); ++ return 0; ++ } ++ down(&msBlk->block_cache_mutex); ++ wake_up(&msBlk->waitq); ++ msBlk->block_cache[i].block = block; ++ msBlk->block_cache[i].next_index = next_index; ++ TRACE("Read cache block [%x:%x]\n", block, offset); ++ } ++ ++ if(msBlk->block_cache[i].block != block) { ++ up(&msBlk->block_cache_mutex); ++ continue; ++ } ++ ++ if((bytes = msBlk->block_cache[i].length - offset) >= length) { ++ if(buffer) ++ memcpy(buffer, msBlk->block_cache[i].data + offset, length); ++ if(msBlk->block_cache[i].length - offset == length) { ++ *next_block = msBlk->block_cache[i].next_index; ++ *next_offset = 0; ++ } else { ++ *next_block = block; ++ *next_offset = offset + length; ++ } ++ ++ up(&msBlk->block_cache_mutex); ++ return return_length; ++ } else { ++ if(buffer) { ++ memcpy(buffer, msBlk->block_cache[i].data + offset, bytes); ++ buffer += bytes; ++ } ++ block = msBlk->block_cache[i].next_index; ++ up(&msBlk->block_cache_mutex); ++ length -= bytes; ++ offset = 0; ++ } ++ } ++} ++ ++ ++static struct inode *squashfs_iget(struct super_block *s, squashfs_inode inode) ++{ ++ struct inode *i = new_inode(s); ++ squashfs_sb_info *msBlk = &s->u.squashfs_sb; ++ squashfs_super_block *sBlk = &msBlk->sBlk; ++ unsigned int block = SQUASHFS_INODE_BLK(inode) + sBlk->inode_table_start; ++ unsigned int offset = SQUASHFS_INODE_OFFSET(inode); ++ unsigned int next_block, next_offset; ++ squashfs_base_inode_header inodeb; ++ ++ TRACE("Entered squashfs_iget\n"); ++ ++ if(msBlk->swap) { ++ squashfs_base_inode_header sinodeb; ++ ++ if(!squashfs_get_cached_block(s, (char *) &sinodeb, block, offset, ++ sizeof(sinodeb), &next_block, &next_offset)) ++ goto failed_read; ++ SQUASHFS_SWAP_BASE_INODE_HEADER(&inodeb, &sinodeb, sizeof(sinodeb)); ++ } else ++ if(!squashfs_get_cached_block(s, (char *) &inodeb, block, offset, ++ sizeof(inodeb), &next_block, &next_offset)) ++ goto failed_read; ++ ++ i->i_nlink = 1; ++ ++ i->i_mtime = sBlk->mkfs_time; ++ i->i_atime = sBlk->mkfs_time; ++ i->i_ctime = sBlk->mkfs_time; ++ ++ if(inodeb.inode_type != SQUASHFS_IPC_TYPE) ++ i->i_uid = msBlk->uid[((inodeb.inode_type - 1) / SQUASHFS_TYPES) * 16 + inodeb.uid]; ++ i->i_ino = SQUASHFS_MK_VFS_INODE(block - sBlk->inode_table_start, offset); ++ ++ i->i_mode = inodeb.mode; ++ ++ switch(inodeb.inode_type == SQUASHFS_IPC_TYPE ? SQUASHFS_IPC_TYPE : (inodeb.inode_type - 1) % SQUASHFS_TYPES + 1) { ++ case SQUASHFS_FILE_TYPE: { ++ squashfs_reg_inode_header inodep; ++ ++ if(msBlk->swap) { ++ squashfs_reg_inode_header sinodep; ++ ++ if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ SQUASHFS_SWAP_REG_INODE_HEADER(&inodep, &sinodep); ++ } else ++ if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ ++ i->i_size = inodep.file_size; ++ i->i_fop = &generic_ro_fops; ++ i->i_data.a_ops = &squashfs_aops; ++ i->i_mode |= S_IFREG; ++ i->i_mtime = inodep.mtime; ++ i->i_atime = inodep.mtime; ++ i->i_ctime = inodep.mtime; ++ i->i_blocks = ((i->i_size - 1) >> 9) + 1; ++ i->i_blksize = PAGE_CACHE_SIZE; ++ i->u.squashfs_i.start_block = inodep.start_block; ++ i->u.squashfs_i.block_list_start = next_block; ++ i->u.squashfs_i.offset = next_offset; ++ TRACE("File inode %x:%x, start_block %x, block_list_start %x, offset %x\n", ++ SQUASHFS_INODE_BLK(inode), offset, inodep.start_block, next_block, next_offset); ++ break; ++ } ++ case SQUASHFS_DIR_TYPE: { ++ squashfs_dir_inode_header inodep; ++ ++ if(msBlk->swap) { ++ squashfs_dir_inode_header sinodep; ++ ++ if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ SQUASHFS_SWAP_DIR_INODE_HEADER(&inodep, &sinodep); ++ } else ++ if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ ++ i->i_size = inodep.file_size; ++ i->i_op = &squashfs_dir_inode_ops; ++ i->i_fop = &squashfs_dir_ops; ++ i->i_mode |= S_IFDIR; ++ i->i_mtime = inodep.mtime; ++ i->i_atime = inodep.mtime; ++ i->i_ctime = inodep.mtime; ++ i->u.squashfs_i.start_block = inodep.start_block; ++ i->u.squashfs_i.offset = inodep.offset; ++ TRACE("Directory inode %x:%x, start_block %x, offset %x\n", SQUASHFS_INODE_BLK(inode), offset, ++ inodep.start_block, inodep.offset); ++ break; ++ } ++ case SQUASHFS_SYMLINK_TYPE: { ++ squashfs_symlink_inode_header inodep; ++ ++ if(msBlk->swap) { ++ squashfs_symlink_inode_header sinodep; ++ ++ if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ SQUASHFS_SWAP_SYMLINK_INODE_HEADER(&inodep, &sinodep); ++ } else ++ if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ ++ i->i_size = inodep.symlink_size; ++ i->i_op = &page_symlink_inode_operations; ++ i->i_data.a_ops = &squashfs_symlink_aops; ++ i->i_mode |= S_IFLNK; ++ i->u.squashfs_i.start_block = next_block; ++ i->u.squashfs_i.offset = next_offset; ++ TRACE("Symbolic link inode %x:%x, start_block %x, offset %x\n", ++ SQUASHFS_INODE_BLK(inode), offset, next_block, next_offset); ++ break; ++ } ++ case SQUASHFS_BLKDEV_TYPE: ++ case SQUASHFS_CHRDEV_TYPE: { ++ squashfs_dev_inode_header inodep; ++ ++ if(msBlk->swap) { ++ squashfs_dev_inode_header sinodep; ++ ++ if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ SQUASHFS_SWAP_DEV_INODE_HEADER(&inodep, &sinodep); ++ } else ++ if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ ++ i->i_size = 0; ++ i->i_mode |= (inodeb.inode_type == SQUASHFS_CHRDEV_TYPE) ? S_IFCHR : S_IFBLK; ++ init_special_inode(i, i->i_mode, inodep.rdev); ++ TRACE("Device inode %x:%x, rdev %x\n", SQUASHFS_INODE_BLK(inode), offset, inodep.rdev); ++ break; ++ } ++ case SQUASHFS_IPC_TYPE: { ++ squashfs_ipc_inode_header inodep; ++ ++ if(msBlk->swap) { ++ squashfs_ipc_inode_header sinodep; ++ ++ if(!squashfs_get_cached_block(s, (char *) &sinodep, block, offset, sizeof(sinodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ SQUASHFS_SWAP_IPC_INODE_HEADER(&inodep, &sinodep); ++ } else ++ if(!squashfs_get_cached_block(s, (char *) &inodep, block, offset, sizeof(inodep), ++ &next_block, &next_offset)) ++ goto failed_read; ++ ++ i->i_size = 0; ++ i->i_mode |= (inodep.type == SQUASHFS_FIFO_TYPE) ? S_IFIFO : S_IFSOCK; ++ i->i_uid = msBlk->uid[inodep.offset * 16 + inodeb.uid]; ++ init_special_inode(i, i->i_mode, 0); ++ break; ++ } ++ default: ++ ERROR("Unknown inode type %d in squashfs_iget!\n", inodeb.inode_type); ++ goto failed_read1; ++ } ++ ++ if(inodeb.guid == SQUASHFS_GUIDS) ++ i->i_gid = i->i_uid; ++ else ++ i->i_gid = msBlk->guid[inodeb.guid]; ++ ++ return i; ++ ++failed_read: ++ ERROR("Unable to read inode [%x:%x]\n", block, offset); ++ ++failed_read1: ++ return NULL; ++} ++ ++ ++static struct super_block *squashfs_read_super(struct super_block *s, ++ void *data, int silent) ++{ ++ kdev_t dev = s->s_dev; ++ squashfs_sb_info *msBlk = &s->u.squashfs_sb; ++ squashfs_super_block *sBlk = &msBlk->sBlk; ++ int i; ++ ++ TRACE("Entered squashfs_read_superblock\n"); ++ ++ msBlk->devblksize = get_hardsect_size(dev); ++ if(msBlk->devblksize < BLOCK_SIZE) ++ msBlk->devblksize = BLOCK_SIZE; ++ msBlk->devblksize_log2 = ffz(~msBlk->devblksize); ++ set_blocksize(dev, msBlk->devblksize); ++ s->s_blocksize = msBlk->devblksize; ++ s->s_blocksize_bits = msBlk->devblksize_log2; ++ ++ init_MUTEX(&msBlk->read_page_mutex); ++ init_MUTEX(&msBlk->block_cache_mutex); ++ ++ init_waitqueue_head(&msBlk->waitq); ++ ++ if(!read_data(s, (char *) sBlk, SQUASHFS_START, sizeof(squashfs_super_block) | SQUASHFS_COMPRESSED_BIT, NULL)) { ++ SERROR("unable to read superblock\n"); ++ goto failed_mount; ++ } ++ ++ /* Check it is a SQUASHFS superblock */ ++ msBlk->swap = 0; ++ if((s->s_magic = sBlk->s_magic) != SQUASHFS_MAGIC) { ++ if(sBlk->s_magic == SQUASHFS_MAGIC_SWAP) { ++ squashfs_super_block sblk; ++ WARNING("Mounting a different endian SQUASHFS filesystem on %s\n", bdevname(dev)); ++ SQUASHFS_SWAP_SUPER_BLOCK(&sblk, sBlk); ++ memcpy(sBlk, &sblk, sizeof(squashfs_super_block)); ++ msBlk->swap = 1; ++ } else { ++ SERROR("Can't find a SQUASHFS superblock on %s\n", bdevname(dev)); ++ goto failed_mount; ++ } ++ } ++ ++ /* Check the MAJOR & MINOR versions */ ++ if(sBlk->s_major != SQUASHFS_MAJOR || sBlk->s_minor > SQUASHFS_MINOR) { ++ SERROR("Major/Minor mismatch, filesystem is (%d:%d), I support (%d: <= %d)\n", ++ sBlk->s_major, sBlk->s_minor, SQUASHFS_MAJOR, SQUASHFS_MINOR); ++ goto failed_mount; ++ } ++ ++ TRACE("Found valid superblock on %s\n", bdevname(dev)); ++ TRACE("Inodes are %scompressed\n", SQUASHFS_UNCOMPRESSED_INODES(sBlk->flags) ? "un" : ""); ++ TRACE("Data is %scompressed\n", SQUASHFS_UNCOMPRESSED_DATA(sBlk->flags) ? "un" : ""); ++ TRACE("Check data is %s present in the filesystem\n", SQUASHFS_CHECK_DATA(sBlk->flags) ? "" : "not"); ++ TRACE("Filesystem size %d bytes\n", sBlk->bytes_used); ++ TRACE("Block size %d\n", sBlk->block_size); ++ TRACE("Number of inodes %d\n", sBlk->inodes); ++ TRACE("Number of uids %d\n", sBlk->no_uids); ++ TRACE("Number of gids %d\n", sBlk->no_guids); ++ TRACE("sBlk->inode_table_start %x\n", sBlk->inode_table_start); ++ TRACE("sBlk->directory_table_start %x\n", sBlk->directory_table_start); ++ TRACE("sBlk->uid_start %x\n", sBlk->uid_start); ++ ++ s->s_flags |= MS_RDONLY; ++ s->s_op = &squashfs_ops; ++ ++ /* Init inode_table block pointer array */ ++ if(!(msBlk->block_cache = (squashfs_cache *) kmalloc(sizeof(squashfs_cache) * SQUASHFS_CACHED_BLKS, GFP_KERNEL))) { ++ ERROR("Failed to allocate block cache\n"); ++ goto failed_mount; ++ } ++ ++ for(i = 0; i < SQUASHFS_CACHED_BLKS; i++) ++ msBlk->block_cache[i].block = SQUASHFS_INVALID_BLK; ++ ++ msBlk->next_cache = 0; ++ ++ /* Allocate read_data block */ ++ msBlk->read_size = (sBlk->block_size < SQUASHFS_METADATA_SIZE) ? SQUASHFS_METADATA_SIZE : sBlk->block_size; ++ if(!(msBlk->read_data = (char *) kmalloc(msBlk->read_size, GFP_KERNEL))) { ++ ERROR("Failed to allocate read_data block\n"); ++ goto failed_mount1; ++ } ++ ++ /* Allocate read_page block */ ++ if(sBlk->block_size > PAGE_CACHE_SIZE && ++ !(msBlk->read_page = (char *) kmalloc(sBlk->block_size, GFP_KERNEL))) { ++ ERROR("Failed to allocate read_page block\n"); ++ goto failed_mount2; ++ } ++ ++ /* Allocate uid and gid tables */ ++ if(!(msBlk->uid = (squashfs_uid *) kmalloc((sBlk->no_uids + ++ sBlk->no_guids) * sizeof(squashfs_uid), GFP_KERNEL))) { ++ ERROR("Failed to allocate uid/gid table\n"); ++ goto failed_mount3; ++ } ++ msBlk->guid = msBlk->uid + sBlk->no_uids; ++ ++ if(msBlk->swap) { ++ squashfs_uid suid[sBlk->no_uids + sBlk->no_guids]; ++ ++ if(!read_data(s, (char *) &suid, sBlk->uid_start, ((sBlk->no_uids + sBlk->no_guids) * ++ sizeof(squashfs_uid)) | SQUASHFS_COMPRESSED_BIT, NULL)) { ++ SERROR("unable to read uid/gid table\n"); ++ goto failed_mount4; ++ } ++ SQUASHFS_SWAP_DATA(msBlk->uid, suid, (sBlk->no_uids + sBlk->no_guids), (sizeof(squashfs_uid) * 8)); ++ } else ++ if(!read_data(s, (char *) msBlk->uid, sBlk->uid_start, ((sBlk->no_uids + sBlk->no_guids) * ++ sizeof(squashfs_uid)) | SQUASHFS_COMPRESSED_BIT, NULL)) { ++ SERROR("unable to read uid/gid table\n"); ++ goto failed_mount4; ++ } ++ ++ if(!(s->s_root = d_alloc_root(squashfs_iget(s, sBlk->root_inode)))) { ++ ERROR("Root inode create failed\n"); ++ goto failed_mount4; ++ } ++ ++ TRACE("Leaving squashfs_read_super\n"); ++ return s; ++ ++failed_mount4: ++ kfree(msBlk->uid); ++failed_mount3: ++ kfree(msBlk->read_page); ++failed_mount2: ++ kfree(msBlk->read_data); ++failed_mount1: ++ kfree(msBlk->block_cache); ++failed_mount: ++ return NULL; ++} ++ ++ ++static int squashfs_statfs(struct super_block *s, struct statfs *buf) ++{ ++ squashfs_super_block *sBlk = &s->u.squashfs_sb.sBlk; ++ ++ TRACE("Entered squashfs_statfs\n"); ++ buf->f_type = SQUASHFS_MAGIC; ++ buf->f_bsize = sBlk->block_size; ++ buf->f_blocks = ((sBlk->bytes_used - 1) >> sBlk->block_log) + 1; ++ buf->f_bfree = buf->f_bavail = 0; ++ buf->f_files = sBlk->inodes; ++ buf->f_ffree = 0; ++ buf->f_namelen = SQUASHFS_NAME_LEN; ++ return 0; ++} ++ ++ ++static int squashfs_symlink_readpage(struct file *file, struct page *page) ++{ ++ struct inode *inode = page->mapping->host; ++ int index = page->index << PAGE_CACHE_SHIFT, length, bytes; ++ int block = inode->u.squashfs_i.start_block; ++ int offset = inode->u.squashfs_i.offset; ++ ++ TRACE("Entered squashfs_symlink_readpage, page index %d, start block %x, offset %x\n", ++ page->index, inode->u.squashfs_i.start_block, inode->u.squashfs_i.offset); ++ ++ for(length = 0; length < index; length += bytes) { ++ if(!(bytes = squashfs_get_cached_block(inode->i_sb, NULL, block, offset, ++ PAGE_CACHE_SIZE, &block, &offset))) { ++ ERROR("Unable to read symbolic link [%x:%x]\n", block, offset); ++ goto skip_read; ++ } ++ } ++ ++ if(length != index) { ++ ERROR("(squashfs_symlink_readpage) length != index\n"); ++ return 0; ++ } ++ ++ bytes = (inode->i_size - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : inode->i_size - length; ++ if(!(bytes = squashfs_get_cached_block(inode->i_sb, page_address(page), block, offset, bytes, &block, &offset))) ++ ERROR("Unable to read symbolic link [%x:%x]\n", block, offset); ++ ++skip_read: ++ memset(page_address(page) + bytes, 0, PAGE_CACHE_SIZE - bytes); ++ flush_dcache_page(page); ++ SetPageUptodate(page); ++ UnlockPage(page); ++ ++ return 0; ++} ++ ++ ++#define SIZE 256 ++static int squashfs_readpage(struct file *file, struct page *page) ++{ ++ struct inode *inode = page->mapping->host; ++ squashfs_sb_info *msBlk = &inode->i_sb->u.squashfs_sb; ++ squashfs_super_block *sBlk = &msBlk->sBlk; ++ unsigned char block_list[SIZE]; ++ unsigned short *block_listp; ++ int index = sBlk->block_log > PAGE_CACHE_SHIFT ? ++ page->index >> (sBlk->block_log - PAGE_CACHE_SHIFT) : ++ page->index << (PAGE_CACHE_SHIFT - sBlk->block_log); ++ int block = inode->u.squashfs_i.start_block, i = 0; ++ int bytes = 0, block_ptr = inode->u.squashfs_i.block_list_start; ++ int offset = inode->u.squashfs_i.offset; ++ int file_blocks = ((inode->i_size - 1) >> sBlk->block_log) + 1; ++ int readahead_blks = sBlk->block_log >= PAGE_CACHE_SHIFT ? 1 : 1 << (PAGE_CACHE_SHIFT - sBlk->block_log); ++ ++ TRACE("Entered squashfs_readpage, page index %d, start block %x\n", page->index, ++ inode->u.squashfs_i.start_block); ++ ++ if(index > file_blocks) ++ goto skip_read; ++ ++ for(;;) { ++ int blocks = (index + readahead_blks - i); ++ if(blocks > (SIZE >> 1)) { ++ if((index - i) <= (SIZE >> 1)) ++ blocks = index - i; ++ else ++ blocks = SIZE >> 1; ++ } ++ ++ if(msBlk->swap) { ++ unsigned char sblock_list[SIZE]; ++ if(!squashfs_get_cached_block(inode->i_sb, (char *) sblock_list, block_ptr, offset, blocks << 1, &block_ptr, &offset)) { ++ ERROR("Unable to read block list [%d:%x]\n", block_ptr, offset); ++ goto skip_read; ++ } ++ SQUASHFS_SWAP_SHORTS(((unsigned short *)block_list), ((unsigned short *)sblock_list), blocks); ++ } else ++ if(!squashfs_get_cached_block(inode->i_sb, (char *) block_list, block_ptr, offset, blocks << 1, &block_ptr, &offset)) { ++ ERROR("Unable to read block list [%d:%x]\n", block_ptr, offset); ++ goto skip_read; ++ } ++ for(block_listp = (unsigned short *) block_list; i < index && blocks; i ++, block_listp ++, blocks --) ++ block += SQUASHFS_COMPRESSED_SIZE(*block_listp); ++ if(blocks >= readahead_blks) ++ break; ++ } ++ ++ if(sBlk->block_log > PAGE_CACHE_SHIFT) { ++ int mask = (1 << (sBlk->block_log - PAGE_CACHE_SHIFT)) - 1; ++ int start_index = page->index & ~mask; ++ int end_index = start_index | mask; ++ int byte_offset = 0; ++ ++ down(&msBlk->read_page_mutex); ++ if(!(bytes = read_data(inode->i_sb, msBlk->read_page, block, *block_listp, NULL))) { ++ ERROR("Unable to read page, block %x, size %x\n", block, (int) *block_listp); ++ goto skip_read; ++ } ++ ++ for(i = start_index; i <= end_index && byte_offset < bytes; i++, byte_offset += PAGE_CACHE_SIZE) { ++ int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : bytes - byte_offset; ++ ++ TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n", bytes, i, byte_offset, available_bytes); ++ ++ if(i == page->index) { ++ memcpy(page_address(page), msBlk->read_page + byte_offset, available_bytes); ++ memset(page_address(page) + available_bytes, 0, PAGE_CACHE_SIZE - available_bytes); ++ flush_dcache_page(page); ++ SetPageUptodate(page); ++ UnlockPage(page); ++ } else { ++ struct page *push_page; ++ ++ if((push_page = grab_cache_page_nowait(page->mapping, i))) { ++ memcpy(page_address(push_page), msBlk->read_page + byte_offset, available_bytes); ++ memset(page_address(push_page) + available_bytes, 0, PAGE_CACHE_SIZE - available_bytes); ++ flush_dcache_page(push_page); ++ SetPageUptodate(push_page); ++ UnlockPage(push_page); ++ page_cache_release(push_page); ++ } ++ } ++ } ++ up( &msBlk->read_page_mutex); ++ ++ return 0; ++ ++ } else if(sBlk->block_log == PAGE_CACHE_SHIFT) { ++ if(!(bytes = read_data(inode->i_sb, page_address(page), block, *block_listp, NULL))) ++ ERROR("Unable to read page, block %x, size %x\n", block, (int) *block_listp); ++ ++ } else { ++ int i_end = index + (1 << (PAGE_CACHE_SHIFT - sBlk->block_log)); ++ char *p = (char *) page_address(page); ++ int byte; ++ ++ if(i_end > file_blocks) ++ i_end = file_blocks; ++ ++ while(index < i_end) { ++ if(!(byte = read_data(inode->i_sb, p, block, *block_listp, NULL))) { ++ ERROR("Unable to read page, block %x, size %x\n", block, (int) *block_listp); ++ goto skip_read; ++ } ++ block += SQUASHFS_COMPRESSED_SIZE(*block_listp); ++ p += byte; ++ bytes += byte; ++ index ++; ++ block_listp ++; ++ } ++ } ++ ++skip_read: ++ memset(page_address(page) + bytes, 0, PAGE_CACHE_SIZE - bytes); ++ flush_dcache_page(page); ++ SetPageUptodate(page); ++ UnlockPage(page); ++ ++ return 0; ++} ++ ++ ++static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir) ++{ ++ struct inode *i = file->f_dentry->d_inode; ++ squashfs_sb_info *msBlk = &i->i_sb->u.squashfs_sb; ++ squashfs_super_block *sBlk = &msBlk->sBlk; ++ int next_block = i->u.squashfs_i.start_block + sBlk->directory_table_start, next_offset = ++ i->u.squashfs_i.offset, length = 0, dirs_read = 0, dir_count; ++ squashfs_dir_header dirh; ++ char buffer[sizeof(squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1]; ++ squashfs_dir_entry *dire = (squashfs_dir_entry *) buffer; ++ ++ TRACE("Entered squashfs_readdir [%x:%x]\n", next_block, next_offset); ++ ++ while(length < i->i_size) { ++ /* read directory header */ ++ if(msBlk->swap) { ++ squashfs_dir_header sdirh; ++ if(!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, next_block, ++ next_offset, sizeof(sdirh), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(sdirh); ++ SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); ++ } else { ++ if(!squashfs_get_cached_block(i->i_sb, (char *) &dirh, next_block, ++ next_offset, sizeof(dirh), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(dirh); ++ } ++ ++ dir_count = dirh.count + 1; ++ while(dir_count--) { ++ if(msBlk->swap) { ++ squashfs_dir_entry sdire; ++ if(!squashfs_get_cached_block(i->i_sb, (char *) &sdire, next_block, ++ next_offset, sizeof(sdire), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(sdire); ++ SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); ++ } else { ++ if(!squashfs_get_cached_block(i->i_sb, (char *) dire, next_block, ++ next_offset, sizeof(*dire), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(*dire); ++ } ++ ++ if(!squashfs_get_cached_block(i->i_sb, dire->name, next_block, ++ next_offset, dire->size + 1, &next_block, &next_offset)) ++ goto failed_read; ++ length += dire->size + 1; ++ ++ if(file->f_pos >= length) ++ continue; ++ ++ dire->name[dire->size + 1] = '\0'; ++ ++ TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n", dirent, ++ dire->name, dire->size + 1, (int) file->f_pos, ++ dirh.start_block, dire->offset, squashfs_filetype_table[dire->type]); ++ ++ if(filldir(dirent, dire->name, dire->size + 1, file->f_pos, SQUASHFS_MK_VFS_INODE(dirh.start_block, ++ dire->offset), squashfs_filetype_table[dire->type]) < 0) { ++ TRACE("Filldir returned less than 0\n"); ++ return dirs_read; ++ } ++ ++ file->f_pos = length; ++ dirs_read ++; ++ } ++ } ++ ++ return dirs_read; ++ ++failed_read: ++ ERROR("Unable to read directory block [%x:%x]\n", next_block, next_offset); ++ return 0; ++} ++ ++ ++static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry) ++{ ++ const char *name =dentry->d_name.name; ++ int len = dentry->d_name.len; ++ struct inode *inode = NULL; ++ squashfs_sb_info *msBlk = &i->i_sb->u.squashfs_sb; ++ squashfs_super_block *sBlk = &msBlk->sBlk; ++ int next_block = i->u.squashfs_i.start_block + sBlk->directory_table_start, next_offset = ++ i->u.squashfs_i.offset, length = 0, dir_count; ++ squashfs_dir_header dirh; ++ char buffer[sizeof(squashfs_dir_entry) + SQUASHFS_NAME_LEN]; ++ squashfs_dir_entry *dire = (squashfs_dir_entry *) buffer; ++ ++ TRACE("Entered squashfs_lookup [%x:%x]\n", next_block, next_offset); ++ ++ while(length < i->i_size) { ++ /* read directory header */ ++ if(msBlk->swap) { ++ squashfs_dir_header sdirh; ++ if(!squashfs_get_cached_block(i->i_sb, (char *) &sdirh, next_block, next_offset, ++ sizeof(sdirh), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(sdirh); ++ SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); ++ } else { ++ if(!squashfs_get_cached_block(i->i_sb, (char *) &dirh, next_block, next_offset, ++ sizeof(dirh), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(dirh); ++ } ++ ++ dir_count = dirh.count + 1; ++ while(dir_count--) { ++ if(msBlk->swap) { ++ squashfs_dir_entry sdire; ++ if(!squashfs_get_cached_block(i->i_sb, (char *) &sdire, ++ next_block,next_offset, sizeof(sdire), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(*dire); ++ SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); ++ } else { ++ if(!squashfs_get_cached_block(i->i_sb, (char *) dire, ++ next_block,next_offset, sizeof(*dire), &next_block, &next_offset)) ++ goto failed_read; ++ length += sizeof(*dire); ++ } ++ ++ if(!squashfs_get_cached_block(i->i_sb, dire->name, ++ next_block, next_offset, dire->size + 1, &next_block, &next_offset)) ++ goto failed_read; ++ length += dire->size + 1; ++ ++ if((len == dire->size + 1) && !strncmp(name, dire->name, len)) { ++ squashfs_inode ino = SQUASHFS_MKINODE(dirh.start_block, dire->offset); ++ ++ TRACE("calling squashfs_iget for directory entry %s, inode %x:%x\n", ++ name, dirh.start_block, dire->offset); ++ ++ inode = squashfs_iget(i->i_sb, ino); ++ ++ goto exit_loop; ++ } ++ } ++ } ++ ++exit_loop: ++ d_add(dentry, inode); ++ return ERR_PTR(0); ++ ++failed_read: ++ ERROR("Unable to read directory block [%x:%x]\n", next_block, next_offset); ++ goto exit_loop; ++} ++ ++ ++static void squashfs_put_super(struct super_block *s) ++{ ++ if(s->u.squashfs_sb.block_cache) kfree(s->u.squashfs_sb.block_cache); ++ if(s->u.squashfs_sb.read_data) kfree(s->u.squashfs_sb.read_data); ++ if(s->u.squashfs_sb.read_page) kfree(s->u.squashfs_sb.read_page); ++ if(s->u.squashfs_sb.uid) kfree(s->u.squashfs_sb.uid); ++ s->u.squashfs_sb.block_cache = (void *) s->u.squashfs_sb.uid = ++ s->u.squashfs_sb.read_data = s->u.squashfs_sb.read_page = NULL; ++} ++ ++ ++static int __init init_squashfs_fs(void) ++{ ++ ++ if(!(stream.workspace = (char *) vmalloc(zlib_inflate_workspacesize()))) { ++ ERROR("Failed to allocate zlib workspace\n"); ++ return -ENOMEM; ++ } ++ return register_filesystem(&squashfs_fs_type); ++} ++ ++ ++static void __exit exit_squashfs_fs(void) ++{ ++ vfree(stream.workspace); ++ unregister_filesystem(&squashfs_fs_type); ++} ++ ++ ++EXPORT_NO_SYMBOLS; ++ ++module_init(init_squashfs_fs); ++module_exit(exit_squashfs_fs); ++MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem"); ++MODULE_AUTHOR("Phillip Lougher "); ++MODULE_LICENSE("GPL"); +diff -urN src/linux-dist/linux/include/linux/fs.h src/linux/linux/include/linux/fs.h +--- src/linux-dist/linux/include/linux/fs.h 2003-07-04 03:12:25.000000000 -0500 ++++ src/linux/linux/include/linux/fs.h 2004-03-29 17:00:53.000000000 -0600 +@@ -313,6 +313,7 @@ + #include + #include + #include ++#include + + /* + * Attribute flags. These should be or-ed together to figure out what +@@ -503,6 +504,7 @@ + struct socket socket_i; + struct usbdev_inode_info usbdev_i; + struct jffs2_inode_info jffs2_i; ++ struct squashfs_inode_info squashfs_i; + void *generic_ip; + } u; + }; +@@ -697,6 +699,7 @@ + #include + #include + #include ++#include + + extern struct list_head super_blocks; + extern spinlock_t sb_lock; +@@ -755,6 +758,7 @@ + struct usbdev_sb_info usbdevfs_sb; + struct jffs2_sb_info jffs2_sb; + struct cramfs_sb_info cramfs_sb; ++ struct squashfs_sb_info squashfs_sb; + void *generic_sbp; + } u; + /* +diff -urN src/linux-dist/linux/include/linux/squashfs_fs.h src/linux/linux/include/linux/squashfs_fs.h +--- src/linux-dist/linux/include/linux/squashfs_fs.h 1969-12-31 18:00:00.000000000 -0600 ++++ src/linux/linux/include/linux/squashfs_fs.h 2004-03-29 17:00:53.000000000 -0600 +@@ -0,0 +1,323 @@ ++#ifndef SQUASHFS_FS ++#define SQUASHFS_FS ++/* ++ * Squashfs ++ * ++ * Copyright (c) 2002 Phillip Lougher ++ * ++ * 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. ++ * ++ * squashfs_fs.h ++ */ ++ ++#define SQUASHFS_MAJOR 1 ++#define SQUASHFS_MINOR 0 ++#define SQUASHFS_MAGIC 0x73717368 ++#define SQUASHFS_MAGIC_SWAP 0x68737173 ++#define SQUASHFS_START 0 ++ ++/* size of metadata (inode and directory) blocks */ ++#define SQUASHFS_METADATA_SIZE 8192 ++#define SQUASHFS_METADATA_LOG 13 ++ ++/* default size of data blocks */ ++#define SQUASHFS_FILE_SIZE 32768 ++#define SQUASHFS_FILE_LOG 15 ++ ++#define SQUASHFS_FILE_MAX_SIZE 32768 ++ ++/* Max number of uids and gids */ ++#define SQUASHFS_UIDS 48 ++#define SQUASHFS_GUIDS 15 ++ ++/* Max length of filename (not 255) */ ++#define SQUASHFS_NAME_LEN 256 ++ ++#define SQUASHFS_INVALID ((long long) 0xffffffffffff) ++#define SQUASHFS_INVALID_BLK ((long long) 0xffffffff) ++#define SQUASHFS_USED_BLK ((long long) 0xfffffffe) ++ ++/* Filesystem flags */ ++#define SQUASHFS_NOI 1 ++#define SQUASHFS_NOD 2 ++#define SQUASHFS_CHECK 4 ++#define SQUASHFS_UNCOMPRESSED_INODES(flags) (flags & SQUASHFS_NOI) ++#define SQUASHFS_UNCOMPRESSED_DATA(flags) (flags & SQUASHFS_NOD) ++#define SQUASHFS_CHECK_DATA(flags) (flags & SQUASHFS_CHECK) ++#define SQUASHFS_MKFLAGS(noi, nod, check_data) (noi | (nod << 1) | (check_data << 2)) ++ ++/* Max number of types and file types */ ++#define SQUASHFS_TYPES 5 ++#define SQUASHFS_DIR_TYPE 1 ++#define SQUASHFS_FILE_TYPE 2 ++#define SQUASHFS_SYMLINK_TYPE 3 ++#define SQUASHFS_BLKDEV_TYPE 4 ++#define SQUASHFS_CHRDEV_TYPE 5 ++ ++#define SQUASHFS_IPC_TYPE 0 ++#define SQUASHFS_FIFO_TYPE 6 ++#define SQUASHFS_SOCKET_TYPE 7 ++ ++/* Flag whether block is compressed or uncompressed, bit is set if block is uncompressed */ ++#define SQUASHFS_COMPRESSED_BIT (1 << 15) ++#define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \ ++ (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) ++ ++#define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT)) ++ ++/* ++ * Inode number ops. Inodes consist of a compressed block number, and an uncompressed ++ * offset within that block ++ */ ++#define SQUASHFS_INODE_BLK(a) ((unsigned int) ((a) >> 16)) ++#define SQUASHFS_INODE_OFFSET(a) ((unsigned int) ((a) & 0xffff)) ++#define SQUASHFS_MKINODE(A, B) ((squashfs_inode)(((squashfs_inode) (A) << 16)\ ++ + (B))) ++ ++/* Compute 32 bit VFS inode number from squashfs inode number */ ++#define SQUASHFS_MK_VFS_INODE(a, b) ((unsigned int) (((a) << 8) + ((b) >> 2) + 1)) ++ ++/* Translate between VFS mode and squashfs mode */ ++#define SQUASHFS_MODE(a) ((a) & 0xfff) ++ ++/* cached data constants for filesystem */ ++#define SQUASHFS_CACHED_BLKS 8 ++ ++#define SQUASHFS_MAX_FILE_SIZE_LOG 32 ++#define SQUASHFS_MAX_FILE_SIZE ((long long) 1 << (SQUASHFS_MAX_FILE_SIZE_LOG - 1)) ++ ++#define SQUASHFS_MARKER_BYTE 0xff ++ ++/* ++ * definitions for structures on disk ++ */ ++ ++typedef unsigned int squashfs_block; ++typedef long long squashfs_inode; ++ ++typedef unsigned int squashfs_uid; ++ ++typedef struct squashfs_super_block { ++ unsigned int s_magic; ++ unsigned int inodes; ++ unsigned int bytes_used; ++ unsigned int uid_start; ++ unsigned int guid_start; ++ unsigned int inode_table_start; ++ unsigned int directory_table_start; ++ unsigned int s_major:16; ++ unsigned int s_minor:16; ++ unsigned int block_size:16; ++ unsigned int block_log:16; ++ unsigned int flags:8; ++ unsigned int no_uids:8; ++ unsigned int no_guids:8; ++ time_t mkfs_time /* time of filesystem creation */; ++ squashfs_inode root_inode; ++} __attribute__ ((packed)) squashfs_super_block; ++ ++typedef struct { ++ unsigned int inode_type:4; ++ unsigned int mode:12; /* protection */ ++ unsigned int uid:4; /* index into uid table */ ++ unsigned int guid:4; /* index into guid table */ ++} __attribute__ ((packed)) squashfs_base_inode_header; ++ ++typedef struct { ++ unsigned int inode_type:4; ++ unsigned int mode:12; /* protection */ ++ unsigned int uid:4; /* index into uid table */ ++ unsigned int guid:4; /* index into guid table */ ++ unsigned int type:4; ++ unsigned int offset:4; ++} __attribute__ ((packed)) squashfs_ipc_inode_header; ++ ++typedef struct { ++ unsigned int inode_type:4; ++ unsigned int mode:12; /* protection */ ++ unsigned int uid:4; /* index into uid table */ ++ unsigned int guid:4; /* index into guid table */ ++ unsigned short rdev; ++} __attribute__ ((packed)) squashfs_dev_inode_header; ++ ++typedef struct { ++ unsigned int inode_type:4; ++ unsigned int mode:12; /* protection */ ++ unsigned int uid:4; /* index into uid table */ ++ unsigned int guid:4; /* index into guid table */ ++ unsigned short symlink_size; ++ char symlink[0]; ++} __attribute__ ((packed)) squashfs_symlink_inode_header; ++ ++typedef struct { ++ unsigned int inode_type:4; ++ unsigned int mode:12; /* protection */ ++ unsigned int uid:4; /* index into uid table */ ++ unsigned int guid:4; /* index into guid table */ ++ time_t mtime; ++ squashfs_block start_block; ++ unsigned int file_size:SQUASHFS_MAX_FILE_SIZE_LOG; ++ unsigned short block_list[0]; ++} __attribute__ ((packed)) squashfs_reg_inode_header; ++ ++typedef struct { ++ unsigned int inode_type:4; ++ unsigned int mode:12; /* protection */ ++ unsigned int uid:4; /* index into uid table */ ++ unsigned int guid:4; /* index into guid table */ ++ unsigned int file_size:19; ++ unsigned int offset:13; ++ time_t mtime; ++ unsigned int start_block:24; ++} __attribute__ ((packed)) squashfs_dir_inode_header; ++ ++typedef union { ++ squashfs_base_inode_header base; ++ squashfs_dev_inode_header dev; ++ squashfs_symlink_inode_header symlink; ++ squashfs_reg_inode_header reg; ++ squashfs_dir_inode_header dir; ++ squashfs_ipc_inode_header ipc; ++} squashfs_inode_header; ++ ++typedef struct { ++ unsigned int offset:13; ++ unsigned int type:3; ++ unsigned int size:8; ++ char name[0]; ++} __attribute__ ((packed)) squashfs_dir_entry; ++ ++typedef struct { ++ unsigned int count:8; ++ unsigned int start_block:24; ++} __attribute__ ((packed)) squashfs_dir_header; ++ ++ ++extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen); ++extern int squashfs_uncompress_init(void); ++extern int squashfs_uncompress_exit(void); ++ ++/* ++ * macros to convert each packed bitfield structure from little endian to big ++ * endian and vice versa. These are needed when creating or using a filesystem on a ++ * machine with different byte ordering to the target architecture. ++ * ++ */ ++ ++#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\ ++ SQUASHFS_MEMSET(s, d, sizeof(squashfs_super_block));\ ++ SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\ ++ SQUASHFS_SWAP((s)->inodes, d, 32, 32);\ ++ SQUASHFS_SWAP((s)->bytes_used, d, 64, 32);\ ++ SQUASHFS_SWAP((s)->uid_start, d, 96, 32);\ ++ SQUASHFS_SWAP((s)->guid_start, d, 128, 32);\ ++ SQUASHFS_SWAP((s)->inode_table_start, d, 160, 32);\ ++ SQUASHFS_SWAP((s)->directory_table_start, d, 192, 32);\ ++ SQUASHFS_SWAP((s)->s_major, d, 224, 16);\ ++ SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\ ++ SQUASHFS_SWAP((s)->block_size, d, 256, 16);\ ++ SQUASHFS_SWAP((s)->block_log, d, 272, 16);\ ++ SQUASHFS_SWAP((s)->flags, d, 288, 8);\ ++ SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\ ++ SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\ ++ SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\ ++ SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\ ++} ++ ++#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\ ++ SQUASHFS_MEMSET(s, d, n);\ ++ SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ ++ SQUASHFS_SWAP((s)->mode, d, 4, 12);\ ++ SQUASHFS_SWAP((s)->uid, d, 16, 4);\ ++ SQUASHFS_SWAP((s)->guid, d, 20, 4);\ ++} ++ ++#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\ ++ SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_dev_inode_header));\ ++ SQUASHFS_SWAP((s)->type, d, 24, 4);\ ++ SQUASHFS_SWAP((s)->offset, d, 28, 4);\ ++} ++#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\ ++ SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_dev_inode_header));\ ++ SQUASHFS_SWAP((s)->rdev, d, 24, 16);\ ++} ++ ++#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\ ++ SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_symlink_inode_header));\ ++ SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\ ++} ++ ++#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\ ++ SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_reg_inode_header));\ ++ SQUASHFS_SWAP((s)->mtime, d, 24, 32);\ ++ SQUASHFS_SWAP((s)->start_block, d, 56, 32);\ ++ SQUASHFS_SWAP((s)->file_size, d, 88, SQUASHFS_MAX_FILE_SIZE_LOG);\ ++} ++ ++#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\ ++ SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, sizeof(squashfs_dir_inode_header));\ ++ SQUASHFS_SWAP((s)->file_size, d, 24, 19);\ ++ SQUASHFS_SWAP((s)->offset, d, 43, 13);\ ++ SQUASHFS_SWAP((s)->mtime, d, 56, 32);\ ++ SQUASHFS_SWAP((s)->start_block, d, 88, 24);\ ++} ++ ++#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\ ++ SQUASHFS_MEMSET(s, d, sizeof(squashfs_dir_header));\ ++ SQUASHFS_SWAP((s)->count, d, 0, 8);\ ++ SQUASHFS_SWAP((s)->start_block, d, 8, 24);\ ++} ++ ++#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\ ++ SQUASHFS_MEMSET(s, d, sizeof(squashfs_dir_entry));\ ++ SQUASHFS_SWAP((s)->offset, d, 0, 13);\ ++ SQUASHFS_SWAP((s)->type, d, 13, 3);\ ++ SQUASHFS_SWAP((s)->size, d, 16, 8);\ ++} ++ ++#define SQUASHFS_SWAP_SHORTS(s, d, n) {\ ++ int entry;\ ++ int bit_position;\ ++ SQUASHFS_MEMSET(s, d, n * 2);\ ++ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += 16)\ ++ SQUASHFS_SWAP(s[entry], d, bit_position, 16);\ ++} ++ ++#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\ ++ int entry;\ ++ int bit_position;\ ++ SQUASHFS_MEMSET(s, d, n * bits / 8);\ ++ for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += bits)\ ++ SQUASHFS_SWAP(s[entry], d, bit_position, bits);\ ++} ++ ++#ifdef __KERNEL__ ++/* ++ * macros used to swap each structure entry, taking into account ++ * bitfields and different bitfield placing conventions on differing architectures ++ */ ++#include ++#ifdef __BIG_ENDIAN ++ /* convert from little endian to big endian */ ++#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, tbits, b_pos) ++#else ++ /* convert from big endian to little endian */ ++#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, tbits, 64 - tbits - b_pos) ++#endif ++ ++#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\ ++ int bits;\ ++ int b_pos = pos % 8;\ ++ unsigned long long val = 0;\ ++ unsigned char *s = (unsigned char *)p + (pos / 8);\ ++ unsigned char *d = ((unsigned char *) &val) + 7;\ ++ for(bits = 0; bits < (tbits + b_pos); bits += 8) \ ++ *d-- = *s++;\ ++ value = (val >> (SHIFT));\ ++} ++#define SQUASHFS_MEMSET(s, d, n) memset(s, 0, n); ++#endif ++#endif +diff -urN src/linux-dist/linux/include/linux/squashfs_fs_i.h src/linux/linux/include/linux/squashfs_fs_i.h +--- src/linux-dist/linux/include/linux/squashfs_fs_i.h 1969-12-31 18:00:00.000000000 -0600 ++++ src/linux/linux/include/linux/squashfs_fs_i.h 2004-03-29 17:00:53.000000000 -0600 +@@ -0,0 +1,21 @@ ++#ifndef SQUASHFS_FS_I ++#define SQUASHFS_FS_I ++/* ++ * Squashfs ++ * ++ * Copyright (c) 2002 Phillip Lougher ++ * ++ * 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. ++ * ++ * squashfs_fs_i.h ++ */ ++ ++typedef struct squashfs_inode_info { ++ unsigned int start_block; ++ unsigned int block_list_start; ++ unsigned int offset; ++ } squashfs_inode_info; ++#endif +diff -urN src/linux-dist/linux/include/linux/squashfs_fs_sb.h src/linux/linux/include/linux/squashfs_fs_sb.h +--- src/linux-dist/linux/include/linux/squashfs_fs_sb.h 1969-12-31 18:00:00.000000000 -0600 ++++ src/linux/linux/include/linux/squashfs_fs_sb.h 2004-03-29 17:00:53.000000000 -0600 +@@ -0,0 +1,41 @@ ++#ifndef SQUASHFS_FS_SB ++#define SQUASHFS_FS_SB ++/* ++ * Squashfs ++ * ++ * Copyright (c) 2002 Phillip Lougher ++ * ++ * 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. ++ * ++ * squashfs_fs_sb.h ++ */ ++ ++#include ++ ++typedef struct { ++ unsigned int block; ++ int length; ++ unsigned int next_index; ++ char *data; ++ } squashfs_cache; ++ ++typedef struct squashfs_sb_info { ++ squashfs_super_block sBlk; ++ int devblksize; ++ int devblksize_log2; ++ int swap; ++ squashfs_cache *block_cache; ++ int next_cache; ++ squashfs_uid *uid; ++ squashfs_uid *guid; ++ unsigned int read_size; ++ char *read_data; ++ char *read_page; ++ struct semaphore read_page_mutex; ++ struct semaphore block_cache_mutex; ++ wait_queue_head_t waitq; ++ } squashfs_sb_info; ++#endif +diff -urN src/linux-dist/linux/init/do_mounts.c src/linux/linux/init/do_mounts.c +--- src/linux-dist/linux/init/do_mounts.c 2003-11-08 02:13:20.000000000 -0600 ++++ src/linux/linux/init/do_mounts.c 2004-03-29 17:00:53.000000000 -0600 +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #undef BUILD_CRAMDISK + +@@ -470,6 +471,7 @@ + * ext2 + * romfs + * gzip ++ * squashfs + */ + static int __init + identify_ramdisk_image(int fd, int start_block) +@@ -479,6 +481,7 @@ + struct ext2_super_block *ext2sb; + struct romfs_super_block *romfsb; + struct cramfs_super *cramfsb; ++ struct squashfs_super_block *squashfsb; + int nblocks = -1; + unsigned char *buf; + +@@ -490,6 +493,7 @@ + ext2sb = (struct ext2_super_block *) buf; + romfsb = (struct romfs_super_block *) buf; + cramfsb = (struct cramfs_super *) buf; ++ squashfsb = (struct squashfs_super_block *) buf; + memset(buf, 0xe5, size); + + /* +@@ -536,6 +540,15 @@ + goto done; + } + ++ /* squashfs is at block zero too */ ++ if (squashfsb->s_magic == SQUASHFS_MAGIC) { ++ printk(KERN_NOTICE ++ "RAMDISK: squashfs filesystem found at block %d\n", ++ start_block); ++ nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS; ++ goto done; ++ } ++ + /* + * Read block 1 to test for minix and ext2 superblock + */ +diff -urN src/linux-dist/linux/kernel/ksyms.c src/linux/linux/kernel/ksyms.c +--- src/linux-dist/linux/kernel/ksyms.c 2003-07-04 03:12:28.000000000 -0500 ++++ src/linux/linux/kernel/ksyms.c 2004-03-29 17:00:53.000000000 -0600 +@@ -482,9 +483,9 @@ + EXPORT_SYMBOL(simple_strtoull); + EXPORT_SYMBOL(system_utsname); /* UTS data */ + EXPORT_SYMBOL(uts_sem); /* UTS semaphore */ +-#ifndef __mips__ ++//#ifndef __mips__ //bite me. -mbm. + EXPORT_SYMBOL(sys_call_table); +-#endif ++//#endif + EXPORT_SYMBOL(machine_restart); + EXPORT_SYMBOL(machine_halt); + EXPORT_SYMBOL(machine_power_off); +diff -urN src/linux-dist/linux/lib/Config.in src/linux/linux/lib/Config.in +--- src/linux-dist/linux/lib/Config.in 2003-07-04 03:12:29.000000000 -0500 ++++ src/linux/linux/lib/Config.in 2004-03-29 17:00:53.000000000 -0600 +@@ -8,12 +8,14 @@ + # Do we need the compression support? + # + if [ "$CONFIG_CRAMFS" = "y" -o \ ++ "$CONFIG_SQUASHFS" = "y" -o \ + "$CONFIG_PPP_DEFLATE" = "y" -o \ + "$CONFIG_JFFS2_FS" = "y" -o \ + "$CONFIG_ZISOFS_FS" = "y" ]; then + define_tristate CONFIG_ZLIB_INFLATE y + else + if [ "$CONFIG_CRAMFS" = "m" -o \ ++ "$CONFIG_SQUASHFS" = "m" -o \ + "$CONFIG_PPP_DEFLATE" = "m" -o \ + "$CONFIG_JFFS2_FS" = "m" -o \ + "$CONFIG_ZISOFS_FS" = "m" ]; then diff --git a/obsolete-buildroot/sources/openwrt-wrt54g-router.patch b/obsolete-buildroot/sources/openwrt-wrt54g-router.patch new file mode 100644 index 0000000000..4098f792e2 --- /dev/null +++ b/obsolete-buildroot/sources/openwrt-wrt54g-router.patch @@ -0,0 +1,240 @@ +diff -bBurN WRT54G/release/src/router/rc/Makefile-openwrt WRT54G.new/release/src/router/rc/Makefile-openwrt +--- WRT54G/release/src/router/rc/Makefile-openwrt 1969-12-31 18:00:00.000000000 -0600 ++++ WRT54G.new/release/src/router/rc/Makefile-openwrt 2004-03-03 16:23:40.000000000 -0600 +@@ -0,0 +1,44 @@ ++# Copyright 2001-2003, Broadcom Corporation ++# All Rights Reserved. ++# ++# ++# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY ++# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM ++# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS ++# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE ++# ++ ++# ++# Router Wireless Interface Configuration Utility Makefile ++# ++# Copyright 2003, Broadcom Corporation ++# All Rights Reserved. ++# ++# ++# $Id: Makefile,v 1.2 2004/01/13 00:55:58 mbm Exp $ ++# ++ ++CFLAGS += -I. -I$(TOP)/shared -I$(SRCBASE)/include -Wall ++#CFLAGS += -g -DDEBUG ++CFLAGS += -s -Os ++LDFLAGS += -L$(TOP)/shared -lshared -L$(TOP)/nvram -lnvram ++ ++OBJS := mtd.o crc.o #http.o ++ ++vpath %.c $(TOP)/shared $(SRCBASE)/rts/src ++ ++all: mtd ++ ++clean: ++ rm -f *.o mtd ++ ++install: all ++ install -d $(INSTALLDIR)/sbin ++ install mtd $(INSTALLDIR)/sbin ++ $(STRIP) $(INSTALLDIR)/sbin/mtd ++ ++mtd.o: mtd.c ++ $(CC) -c $^ $(CFLAGS) $(CPPFLAGS) -DOPENWRT_MTD #-DOPENWRT_MTD_HTTP_GET ++ ++mtd: $(OBJS) ++ $(CC) -o $@ $^ $(LDFLAGS) +diff -bBurN WRT54G/release/src/router/rc/mtd.c WRT54G.new/release/src/router/rc/mtd.c +--- WRT54G/release/src/router/rc/mtd.c 2004-01-19 20:34:50.000000000 -0600 ++++ WRT54G.new/release/src/router/rc/mtd.c 2004-03-03 16:24:42.000000000 -0600 +@@ -37,6 +37,86 @@ + #include + #include + ++ ++#ifdef OPENWRT_MTD ++ ++extern int ++mtd_open(const char *mtd, int flags); ++extern int ++mtd_erase(const char *mtd); ++extern int ++mtd_write(const char *path, const char *mtd); ++ ++/* Slightly modified version of mtd_erase. */ ++int ++mtd_unlock(const char *mtd) ++{ ++ int mtd_fd; ++ mtd_info_t mtd_info; ++ erase_info_t erase_info; ++ ++ /* Open MTD device */ ++ if ((mtd_fd = mtd_open(mtd, O_RDWR)) < 0) { ++ perror(mtd); ++ return errno; ++ } ++ ++ /* Get sector size */ ++ if (ioctl(mtd_fd, MEMGETINFO, &mtd_info) != 0) { ++ perror(mtd); ++ close(mtd_fd); ++ return errno; ++ } ++ ++ erase_info.length = mtd_info.erasesize; ++ ++ for (erase_info.start = 0; ++ erase_info.start < mtd_info.size; ++ erase_info.start += mtd_info.erasesize) { ++ (void) ioctl(mtd_fd, MEMUNLOCK, &erase_info); ++/* if (ioctl(mtd_fd, MEMERASE, &erase_info) != 0) { */ ++/* perror(mtd); */ ++/* close(mtd_fd); */ ++/* return errno; */ ++/* } */ ++ } ++ ++ close(mtd_fd); ++ return 0; ++} ++ ++int main(int argc, char **argv) { ++ if(argc == 3 && strcasecmp(argv[1],"unlock")==0) { ++ printf("Unlocking %s\n",argv[2]); ++ return mtd_unlock(argv[2]); ++ } ++ if(argc == 3 && strcasecmp(argv[1],"erase")==0) { ++ printf("Erasing %s\n",argv[2]); ++ return mtd_erase(argv[2]); ++ } ++ if(argc == 4 && strcasecmp(argv[1],"write")==0) { ++ printf("writing %s to %s\n",argv[2],argv[3]); ++ return mtd_write(argv[2],argv[3]); ++ } ++ ++ printf("no valid command given\n"); ++ return -1; ++} ++ ++#ifndef OPENWRT_MTD_HTTP_GET ++/* Dummy routines when no http support. */ ++int ++http_get(const char *server, char *buf, size_t count, off_t offset) ++{ ++ printf("error opening %s\n",server); ++ exit(-1); ++} ++#endif ++ ++#define check_action() (fp ? ACT_IDLE : ACT_WEBS_UPGRADE) ++ ++#endif ++ + /* + * Open an MTD device + * @param mtd path to or partition name of MTD device +diff -bBurN WRT54G/release/src/router/shared/Makefile-openwrt WRT54G.new/release/src/router/shared/Makefile-openwrt +--- WRT54G/release/src/router/shared/Makefile-openwrt 1969-12-31 18:00:00.000000000 -0600 ++++ WRT54G.new/release/src/router/shared/Makefile-openwrt 2004-03-03 12:39:17.000000000 -0600 +@@ -0,0 +1,41 @@ ++# ++# Linux router shared code Makefile ++# ++# Copyright 2001-2003, Broadcom Corporation ++# All Rights Reserved. ++# ++# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY ++# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM ++# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS ++# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. ++# ++# $Id: Makefile,v 1.3 2004/01/13 00:51:09 mbm Exp $ ++# ++ifneq ($(wildcard $(SRCBASE)/cy_conf.mak),) ++ include $(SRCBASE)/cy_conf.mak ++endif ++ ++CFLAGS += -I. -I$(SRCBASE)/include -Wall -I$(SRCBASE)/ ++#CFLAGS += -g -DDEBUG ++CFLAGS += -s -Os ++LDFLAGS += -L. ++ ++all: libshared.so ++ ++install: all ++ install -d $(INSTALLDIR)/usr/lib ++ install -m 755 libshared.so $(INSTALLDIR)/usr/lib ++ $(STRIP) $(INSTALLDIR)/usr/lib/libshared.so ++ ++clean: ++ rm -f *.o *.so ++ ++libshared.so: shutils.o wl.o wl_linux.o defaults.o ++ $(LD) -shared -o $@ $^ ++ ++build_date.o: build_date.c ++ ++build_date: ++ echo "const char *builddate = \"`date`\";" > build_date.c ++ ++*.o: $(CY_DEPS) +diff -bBurN WRT54GS/release/src/router/nvram/nvram_linux.c-dist WRT54GS.new/release/src/router/nvram/nvram_linux.c +--- WRT54GS/release/src/router/nvram/nvram_linux.c-dist 2004-03-30 10:04:10.000000000 -0600 ++++ WRT54GS/release/src/router/nvram/nvram_linux.c 2004-03-30 10:10:09.000000000 -0600 +@@ -27,8 +27,10 @@ + #include + #include + #include ++#ifndef OPENWRT_NVRAM + #include + #include ++#endif + + #define PATH_DEV_NVRAM "/dev/nvram" + +@@ -182,6 +184,20 @@ + { + int ret; + ++#ifdef OPENWRT_NVRAM ++ fprintf(stderr, "nvram_commit(): start\n"); ++ ++ if (nvram_fd < 0) ++ if ((ret = nvram_init(NULL))) ++ return ret; ++ ++ ret = ioctl(nvram_fd, NVRAM_MAGIC, NULL); ++ ++ if (ret < 0) ++ perror(PATH_DEV_NVRAM); ++ ++ fprintf(stderr, "nvram_commit(): end\n"); ++#else + cprintf("nvram_commit(): start\n"); + + if((check_action() == ACT_IDLE) || +@@ -200,6 +216,7 @@ + } + else + cprintf("nvram_commit(): nothing to do...\n"); ++#endif + + return ret; + } +@@ -272,6 +289,7 @@ + return j; + } + ++#ifndef OPENWRT_NVRAM + int + check_action(void) + { +@@ -318,3 +336,5 @@ + + return 0; + } ++ ++#endif diff --git a/obsolete-buildroot/sources/openwrt-wrt54g-shared.patch b/obsolete-buildroot/sources/openwrt-wrt54g-shared.patch new file mode 100644 index 0000000000..f357885bcc --- /dev/null +++ b/obsolete-buildroot/sources/openwrt-wrt54g-shared.patch @@ -0,0 +1,11 @@ +--- WRT54G/release/src/shared/sbpci.c-dist 2004-03-15 13:13:37.000000000 -0600 ++++ WRT54G/release/src/shared/sbpci.c 2004-03-15 13:15:38.000000000 -0600 +@@ -269,7 +269,7 @@ + sb_core_reset(sbh, 0); + + /* In some board, */ +- if(nvram_match("boardtype", "bcm94710dev")) ++ if(nvram_match("boardtype", "bcm94710dev") || nvram_match("boardtype", "bcm94710ap")) + CT4712_WR = 0; + else + CT4712_WR = 1; diff --git a/obsolete-buildroot/sources/patch-kernel.sh b/obsolete-buildroot/sources/patch-kernel.sh new file mode 100755 index 0000000000..79401c2a74 --- /dev/null +++ b/obsolete-buildroot/sources/patch-kernel.sh @@ -0,0 +1,53 @@ +#! /bin/sh +# A little script I whipped up to make it easy to +# patch source trees and have sane error handling +# -Erik +# +# (c) 2002 Erik Andersen + +# Set directories from arguments, or use defaults. +targetdir=${1-.} +patchdir=${2-../kernel-patches} +patchpattern=${3-*} + +if [ ! -d "${targetdir}" ] ; then + echo "Aborting. '${targetdir}' is not a directory." + exit 1 +fi +if [ ! -d "${patchdir}" ] ; then + echo "Aborting. '${patchdir}' is not a directory." + exit 1 +fi + +for i in ${patchdir}/${patchpattern} ; do + case "$i" in + *.gz) + type="gzip"; uncomp="gunzip -dc"; ;; + *.bz) + type="bzip"; uncomp="bunzip -dc"; ;; + *.bz2) + type="bzip2"; uncomp="bunzip2 -dc"; ;; + *.zip) + type="zip"; uncomp="unzip -d"; ;; + *.Z) + type="compress"; uncomp="uncompress -c"; ;; + *) + type="plaintext"; uncomp="cat"; ;; + esac + echo "" + echo "Applying ${i} using ${type}: " + ${uncomp} ${i} | patch -p1 -E -d ${targetdir} + if [ $? != 0 ] ; then + echo "Patch failed! Please fix $i!" + exit 1 + fi +done + +# Check for rejects... +if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then + echo "Aborting. Reject files found." + exit 1 +fi + +# Remove backup files +find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; diff --git a/obsolete-buildroot/sources/pcmcia.patch b/obsolete-buildroot/sources/pcmcia.patch new file mode 100644 index 0000000000..121435fc1b --- /dev/null +++ b/obsolete-buildroot/sources/pcmcia.patch @@ -0,0 +1,123 @@ +--- pcmcia-cs-3.1.34/etc/config.opts.orig Tue Jul 9 09:36:23 2002 ++++ pcmcia-cs-3.1.34/etc/config.opts Tue Jul 9 09:37:47 2002 +@@ -5,7 +5,7 @@ + + # System resources available for PCMCIA devices + +-include port 0x100-0x4ff, port 0x800-0x8ff, port 0xc00-0xcff ++include port 0x100-0x4ff, port 0xc00-0xcff + include memory 0xc0000-0xfffff + include memory 0xa0000000-0xa0ffffff, memory 0x60000000-0x60ffffff + +diff -urN pcmcia-cs-3.2.3.orig/etc/shared pcmcia-cs-3.2.3/etc/shared +--- pcmcia-cs-3.2.3.orig/etc/shared 2002-08-18 21:21:11.000000000 -0600 ++++ pcmcia-cs-3.2.3/etc/shared 2003-02-14 05:05:07.000000000 -0700 +@@ -2,6 +2,8 @@ + # shared 1.31 2002/08/19 03:21:11 (David Hinds) + # + ++umask 022 ++ + usage () + { + echo "usage: $0 [action] [device name]" +--- /dev/null 2003-01-21 22:14:35.000000000 -0700 ++++ pcmcia-cs-3.2.4/etc/pcmcia 2003-06-09 12:04:02.000000000 -0600 +@@ -0,0 +1,6 @@ ++# Defaults for pcmcia (sourced by /etc/init.d/S30pcmcia) ++PCMCIA=yes ++PCIC=yenta_socket ++PCIC_OPTS= ++CORE_OPTS= ++CARDMGR_OPTS= +--- pcmcia-cs-3.2.4/etc/rc.pcmcia.orig 2002-08-08 00:43:43.000000000 -0600 ++++ pcmcia-cs-3.2.4/etc/rc.pcmcia 2003-06-09 15:17:28.000000000 -0600 +@@ -4,6 +4,8 @@ + # + # This is designed to work in BSD as well as SysV init setups. See + # the HOWTO for customization instructions. ++# Modified to comply with Debian's standards by Brian Mays ++# . + + # Tags for Red Hat init configuration tools + # +@@ -26,9 +28,9 @@ + done + + # Source PCMCIA configuration, if available +-if [ -f /etc/pcmcia.conf ] ; then ++if [ -f /etc/default/pcmcia ] ; then + # Debian startup option file +- . /etc/pcmcia.conf ++ . /etc/default/pcmcia + elif [ -f /etc/sysconfig/pcmcia ] ; then + # Red Hat startup option file + . /etc/sysconfig/pcmcia +@@ -50,9 +52,22 @@ + done + if [ "$PCMCIA" -a "$PCMCIA" != "yes" ] ; then exit 0 ; fi + ++# Debian modification: Fix PCIC for stand-alone modules. ++# yenta_socket -> i82365 on these systems. ++# Existence of a standalone module implies that it is preferred. ++if [ -d /lib/modules/preferred ] ; then ++ PC=/lib/modules/preferred/pcmcia ++else ++ PC=/lib/modules/`uname -r`/pcmcia ++fi ++if [ "$PCIC" = yenta_socket -a -e $PC/i82365.o \ ++ -a ! -L $PC/i82365.o ]; then ++ PCIC=i82365 ++fi ++ + usage() + { +- echo "Usage: $0 {start|stop|status|restart|reload}" ++ echo "Usage: $0 {start|stop|status|restart|reload|force-reload}" + } + + cleanup() +@@ -84,7 +99,7 @@ + SC=/var/lib/pcmcia/scheme + RUN=/var/lib/pcmcia + else +- SC=/var/run/pcmcia-scheme ++ SC=/var/lib/misc/pcmcia-scheme + RUN=/var/run + fi + if [ -L $SC -o ! -O $SC ] ; then rm -f $SC ; fi +@@ -154,7 +172,7 @@ + ;; + + status) +- pid=`/sbin/pidof cardmgr` ++ pid=`/bin/pidof cardmgr` + if [ "$pid" != "" ] ; then + echo "cardmgr (pid $pid) is running..." + EXITCODE=0 +@@ -164,12 +182,18 @@ + fi + ;; + +- restart|reload) ++ restart) + $0 stop + $0 start + EXITCODE=$? + ;; + ++ reload|force-reload) ++ echo "Reloading $DESC configuration files." ++ kill -1 `cat /var/run/cardmgr.pid` 2>/dev/null ++ EXITCODE=0 ++ ;; ++ + *) + usage + ;; +@@ -179,4 +203,4 @@ + done + + # Only exit if we're in our own subshell +-case $0 in *rc.pcmcia) exit $EXITCODE ;; esac ++case $0 in *pcmcia) exit $EXITCODE ;; esac diff --git a/obsolete-buildroot/sources/perl-cross-0.1.tar.gz b/obsolete-buildroot/sources/perl-cross-0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d0c553dc8aaf3fc8fe71fb8adf1fea42b14b4dfd GIT binary patch literal 11872 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 aSv-qp@hqOjvv~ghKK~0aVCKL8$N&Ij>KY;d literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/perl.patch b/obsolete-buildroot/sources/perl.patch new file mode 100644 index 0000000000..0e9ab19d4f --- /dev/null +++ b/obsolete-buildroot/sources/perl.patch @@ -0,0 +1,996 @@ +diff -urN cross.o/Makefile cross.x/Makefile +--- Makefile 2003-04-15 14:35:51.000000000 -0600 ++++ perl-5.8.0.uclibc/cross/Makefile 2003-06-27 16:38:23.000000000 -0600 +@@ -49,8 +49,8 @@ + @echo toolchain: $(CC), $(CXX), $(LD), $(STRIP), $(AR), $(RANLIB) + @echo Optimizations: $(FULL_OPTIMIZATION) + +- $(TOPDIR)/generate_config_sh config.sh-$(SYS) > $(TOPDIR)/../config.sh +- $(TOPDIR)/generate_config_sh config.sh-$(SYS) > $(TOPDIR)/../config.sh-arse ++ $(TOPDIR)/generate_config_sh config.sh.uclibc > $(TOPDIR)/../config.sh ++ $(TOPDIR)/generate_config_sh config.sh.uclibc > $(TOPDIR)/../config.sh-arse + cd $(TOPDIR)/.. ; ./Configure -S ; make depend ; make ; make more + cd $(TOPDIR)/.. ; mkdir -p fake_config_library ; cp lib/Config.pm fake_config_library + cd $(TOPDIR)/.. ; $(MAKE) more2 "PERLRUN=/usr/bin/perl -I$(TOPDIR)/../fake_config_library -MConfig" +diff -urN cross.o/config.sh.uclibc cross.x/config.sh.uclibc +--- /dev/null ++++ perl-5.8.0.uclibc/cross/config.sh.uclibc 2003-06-27 16:53:28.000000000 -0600 +@@ -0,0 +1,978 @@ ++#!/bin/sh ++# ++# This file was produced by running the Configure script. It holds all the ++# definitions figured out by Configure. Should you modify one of these values, ++# do not forget to propagate your changes by running "Configure -der". You may ++# instead choose to run each of the .SH files by yourself, or "Configure -S". ++# ++ ++# Package name : perl5 ++# Source directory : . ++# Configuration time: Fri Jun 27 16:41:22 MDT 2003 ++# Configured by : root ++# Target system : ++ ++Author='' ++Date='$Date' ++Header='' ++Id='$Id' ++Locker='' ++Log='$Log' ++Mcc='Mcc' ++RCSfile='$RCSfile' ++Revision='$Revision' ++Source='' ++State='' ++_a='.a' ++_exe='' ++_o='.o' ++afs='false' ++afsroot='/afs' ++alignbytes='4' ++ansi2knr='' ++aphostname='/bin/hostname' ++api_revision='5' ++api_subversion='0' ++api_version='8' ++api_versionstring='5.8.0' ++ar='TARGET_CROSSar' ++archlib='/usr/lib/perl/5.8.0/TARGET_ARCH-linux' ++archlibexp='/usr/lib/perl/5.8.0/TARGET_ARCH-linux' ++archname64='' ++archname='TARGET_ARCH-linux' ++archobjs='' ++asctime_r_proto='0' ++awk='awk' ++baserev='5.0' ++bash='' ++bin='/usr/bin' ++binexp='/usr/bin' ++bison='bison' ++byacc='byacc' ++byteorder='1234' ++c='' ++castflags='0' ++cat='cat' ++cc='TARGET_CROSScc' ++cccdlflags='-fpic' ++ccdlflags='-rdynamic' ++ccflags='-fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ++ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ++ccname='gcc' ++ccsymbols='__ARM_ARCH_4T__=1 __GNUC_MINOR__=3 __GNUC_PATCHLEVEL__=0' ++ccversion='' ++cf_by='root' ++charsize='1' ++chgrp='' ++chmod='chmod' ++chown='' ++clocktype='clock_t' ++comm='comm' ++compress='' ++contains='grep' ++cp='cp' ++cpio='' ++cpp='cpp' ++cpp_stuff='42' ++cppccsymbols='__GNUC__=3' ++cppflags='-fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ++cpplast='-' ++cppminus='-' ++cpprun='TARGET_CROSScc -E' ++cppstdin='TARGET_CROSScc -E' ++cppsymbols='BIG_ENDIAN=4321 __BIG_ENDIAN=4321 __ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC_MINOR__=3 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 LITTLE_ENDIAN=1234 __LITTLE_ENDIAN=1234 _POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1 __unix__=1' ++crypt_r_proto='0' ++cryptlib='' ++csh='csh' ++ctermid_r_proto='0' ++ctime_r_proto='0' ++d_Gconvert='gcvt((x),(n),(b))' ++d_PRIEUldbl='define' ++d_PRIFUldbl='define' ++d_PRIGUldbl='define' ++d_PRIXU64='define' ++d_PRId64='define' ++d_PRIeldbl='define' ++d_PRIfldbl='define' ++d_PRIgldbl='define' ++d_PRIi64='define' ++d_PRIo64='define' ++d_PRIu64='define' ++d_PRIx64='define' ++d_SCNfldbl='define' ++d__fwalk='undef' ++d_access='define' ++d_accessx='undef' ++d_alarm='define' ++d_archlib='define' ++d_asctime_r='undef' ++d_atolf='undef' ++d_atoll='define' ++d_attribut='define' ++d_bcmp='define' ++d_bcopy='define' ++d_bsd='undef' ++d_bsdgetpgrp='undef' ++d_bsdsetpgrp='undef' ++d_bzero='define' ++d_casti32='define' ++d_castneg='define' ++d_charvspr='define' ++d_chown='define' ++d_chroot='define' ++d_chsize='undef' ++d_class='undef' ++d_closedir='define' ++d_cmsghdr_s='define' ++d_const='define' ++d_crypt='define' ++d_crypt_r='undef' ++d_csh='undef' ++d_ctermid_r='undef' ++d_ctime_r='undef' ++d_cuserid='undef' ++d_dbl_dig='define' ++d_dbminitproto='undef' ++d_difftime='define' ++d_dirfd='define' ++d_dirnamlen='undef' ++d_dlerror='define' ++d_dlopen='define' ++d_dlsymun='undef' ++d_dosuid='undef' ++d_drand48_r='undef' ++d_drand48proto='define' ++d_dup2='define' ++d_eaccess='undef' ++d_endgrent='define' ++d_endgrent_r='undef' ++d_endhent='define' ++d_endhostent_r='undef' ++d_endnent='define' ++d_endnetent_r='undef' ++d_endpent='define' ++d_endprotoent_r='undef' ++d_endpwent='define' ++d_endpwent_r='undef' ++d_endsent='define' ++d_endservent_r='undef' ++d_eofnblk='define' ++d_eunice='undef' ++d_fchdir='define' ++d_fchmod='define' ++d_fchown='define' ++d_fcntl='define' ++d_fcntl_can_lock='define' ++d_fd_macros='define' ++d_fd_set='define' ++d_fds_bits='undef' ++d_fgetpos='define' ++d_finite='define' ++d_finitel='undef' ++d_flexfnam='define' ++d_flock='define' ++d_flockproto='define' ++d_fork='define' ++d_fp_class='undef' ++d_fpathconf='define' ++d_fpclass='undef' ++d_fpclassify='define' ++d_fpclassl='undef' ++d_fpos64_t='undef' ++d_frexpl='undef' ++d_fs_data_s='undef' ++d_fseeko='define' ++d_fsetpos='define' ++d_fstatfs='define' ++d_fstatvfs='define' ++d_fsync='define' ++d_ftello='define' ++d_ftime='undef' ++d_getcwd='define' ++d_getespwnam='undef' ++d_getfsstat='undef' ++d_getgrent='define' ++d_getgrent_r='undef' ++d_getgrgid_r='undef' ++d_getgrnam_r='undef' ++d_getgrps='define' ++d_gethbyaddr='define' ++d_gethbyname='define' ++d_gethent='define' ++d_gethname='define' ++d_gethostbyaddr_r='undef' ++d_gethostbyname_r='undef' ++d_gethostent_r='undef' ++d_gethostprotos='define' ++d_getitimer='define' ++d_getlogin='define' ++d_getlogin_r='undef' ++d_getmnt='undef' ++d_getmntent='define' ++d_getnbyaddr='define' ++d_getnbyname='define' ++d_getnent='define' ++d_getnetbyaddr_r='undef' ++d_getnetbyname_r='undef' ++d_getnetent_r='undef' ++d_getnetprotos='define' ++d_getpagsz='define' ++d_getpbyname='define' ++d_getpbynumber='define' ++d_getpent='define' ++d_getpgid='define' ++d_getpgrp2='undef' ++d_getpgrp='define' ++d_getppid='define' ++d_getprior='define' ++d_getprotobyname_r='undef' ++d_getprotobynumber_r='undef' ++d_getprotoent_r='undef' ++d_getprotoprotos='define' ++d_getprpwnam='undef' ++d_getpwent='define' ++d_getpwent_r='undef' ++d_getpwnam_r='undef' ++d_getpwuid_r='undef' ++d_getsbyname='define' ++d_getsbyport='define' ++d_getsent='define' ++d_getservbyname_r='undef' ++d_getservbyport_r='undef' ++d_getservent_r='undef' ++d_getservprotos='define' ++d_getspnam='define' ++d_getspnam_r='undef' ++d_gettimeod='define' ++d_gmtime_r='undef' ++d_gnulibc='undef' ++d_grpasswd='define' ++d_hasmntopt='define' ++d_htonl='define' ++d_index='undef' ++d_inetaton='define' ++d_int64_t='define' ++d_isascii='define' ++d_isfinite='undef' ++d_isinf='define' ++d_isnan='define' ++d_isnanl='define' ++d_killpg='define' ++d_lchown='define' ++d_ldbl_dig='define' ++d_link='define' ++d_localtime_r='undef' ++d_locconv='define' ++d_lockf='define' ++d_longdbl='define' ++d_longlong='define' ++d_lseekproto='define' ++d_lstat='define' ++d_madvise='define' ++d_mblen='define' ++d_mbstowcs='define' ++d_mbtowc='define' ++d_memchr='define' ++d_memcmp='define' ++d_memcpy='define' ++d_memmove='define' ++d_memset='define' ++d_mkdir='define' ++d_mkdtemp='define' ++d_mkfifo='define' ++d_mkstemp='define' ++d_mkstemps='undef' ++d_mktime='define' ++d_mmap='define' ++d_modfl='undef' ++d_modfl_pow32_bug='undef' ++d_mprotect='define' ++d_msg='define' ++d_msg_ctrunc='define' ++d_msg_dontroute='define' ++d_msg_oob='define' ++d_msg_peek='define' ++d_msg_proxy='define' ++d_msgctl='define' ++d_msgget='define' ++d_msghdr_s='define' ++d_msgrcv='define' ++d_msgsnd='define' ++d_msync='define' ++d_munmap='define' ++d_mymalloc='undef' ++d_nice='define' ++d_nl_langinfo='define' ++d_nv_preserves_uv='define' ++d_off64_t='undef' ++d_old_pthread_create_joinable='undef' ++d_oldpthreads='undef' ++d_oldsock='undef' ++d_open3='define' ++d_pathconf='define' ++d_pause='define' ++d_perl_otherlibdirs='undef' ++d_phostname='undef' ++d_pipe='define' ++d_poll='define' ++d_portable='define' ++d_procselfexe='define' ++d_pthread_atfork='undef' ++d_pthread_yield='undef' ++d_pwage='undef' ++d_pwchange='undef' ++d_pwclass='undef' ++d_pwcomment='undef' ++d_pwexpire='undef' ++d_pwgecos='define' ++d_pwpasswd='define' ++d_pwquota='undef' ++d_qgcvt='undef' ++d_quad='define' ++d_random_r='undef' ++d_readdir64_r='undef' ++d_readdir='define' ++d_readdir_r='undef' ++d_readlink='define' ++d_readv='define' ++d_recvmsg='define' ++d_rename='define' ++d_rewinddir='define' ++d_rmdir='define' ++d_safebcpy='undef' ++d_safemcpy='undef' ++d_sanemcmp='define' ++d_sbrkproto='define' ++d_sched_yield='define' ++d_scm_rights='define' ++d_seekdir='define' ++d_select='define' ++d_sem='define' ++d_semctl='define' ++d_semctl_semid_ds='define' ++d_semctl_semun='define' ++d_semget='define' ++d_semop='define' ++d_sendmsg='define' ++d_setegid='define' ++d_seteuid='define' ++d_setgrent='define' ++d_setgrent_r='undef' ++d_setgrps='define' ++d_sethent='define' ++d_sethostent_r='undef' ++d_setitimer='define' ++d_setlinebuf='define' ++d_setlocale='define' ++d_setlocale_r='undef' ++d_setnent='define' ++d_setnetent_r='undef' ++d_setpent='define' ++d_setpgid='define' ++d_setpgrp2='undef' ++d_setpgrp='define' ++d_setprior='define' ++d_setproctitle='undef' ++d_setprotoent_r='undef' ++d_setpwent='define' ++d_setpwent_r='undef' ++d_setregid='define' ++d_setresgid='define' ++d_setresuid='define' ++d_setreuid='define' ++d_setrgid='undef' ++d_setruid='undef' ++d_setsent='define' ++d_setservent_r='undef' ++d_setsid='define' ++d_setvbuf='define' ++d_sfio='undef' ++d_shm='define' ++d_shmat='define' ++d_shmatprototype='define' ++d_shmctl='define' ++d_shmdt='define' ++d_shmget='define' ++d_sigaction='define' ++d_sigprocmask='define' ++d_sigsetjmp='define' ++d_sockatmark='undef' ++d_sockatmarkproto='undef' ++d_socket='define' ++d_socklen_t='define' ++d_sockpair='define' ++d_socks5_init='undef' ++d_sqrtl='undef' ++d_srand48_r='undef' ++d_srandom_r='undef' ++d_sresgproto='undef' ++d_sresuproto='undef' ++d_statblks='define' ++d_statfs_f_flags='undef' ++d_statfs_s='define' ++d_statvfs='define' ++d_stdio_cnt_lval='undef' ++d_stdio_ptr_lval='undef' ++d_stdio_ptr_lval_nochange_cnt='undef' ++d_stdio_ptr_lval_sets_cnt='undef' ++d_stdio_stream_array='undef' ++d_stdiobase='undef' ++d_stdstdio='undef' ++d_strchr='define' ++d_strcoll='define' ++d_strctcpy='define' ++d_strerrm='strerror(e)' ++d_strerror='define' ++d_strerror_r='undef' ++d_strftime='define' ++d_strtod='define' ++d_strtol='define' ++d_strtold='define' ++d_strtoll='define' ++d_strtoq='define' ++d_strtoul='define' ++d_strtoull='define' ++d_strtouq='define' ++d_strxfrm='define' ++d_suidsafe='undef' ++d_symlink='define' ++d_syscall='define' ++d_syscallproto='define' ++d_sysconf='define' ++d_sysernlst='' ++d_syserrlst='define' ++d_system='define' ++d_tcgetpgrp='define' ++d_tcsetpgrp='define' ++d_telldir='define' ++d_telldirproto='define' ++d_time='define' ++d_times='define' ++d_tm_tm_gmtoff='define' ++d_tm_tm_zone='define' ++d_tmpnam_r='undef' ++d_truncate='define' ++d_ttyname_r='undef' ++d_tzname='define' ++d_u32align='undef' ++d_ualarm='undef' ++d_umask='define' ++d_uname='define' ++d_union_semun='undef' ++d_unordered='undef' ++d_usleep='define' ++d_usleepproto='define' ++d_ustat='undef' ++d_vendorarch='undef' ++d_vendorbin='undef' ++d_vendorlib='undef' ++d_vfork='undef' ++d_void_closedir='undef' ++d_voidsig='define' ++d_voidtty='' ++d_volatile='define' ++d_vprintf='define' ++d_wait4='define' ++d_waitpid='define' ++d_wcstombs='define' ++d_wctomb='define' ++d_writev='define' ++d_xenix='undef' ++date='date' ++db_hashtype='u_int32_t' ++db_prefixtype='size_t' ++db_version_major='' ++db_version_minor='' ++db_version_patch='' ++defvoidused='15' ++direntrytype='struct dirent' ++dlext='so' ++dlsrc='dl_dlopen.xs' ++doublesize='8' ++drand01='drand48()' ++drand48_r_proto='0' ++dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' ++eagain='EAGAIN' ++ebcdic='undef' ++echo='echo' ++egrep='egrep' ++emacs='' ++endgrent_r_proto='0' ++endhostent_r_proto='0' ++endnetent_r_proto='0' ++endprotoent_r_proto='0' ++endpwent_r_proto='0' ++endservent_r_proto='0' ++eunicefix=':' ++exe_ext='' ++expr='expr' ++extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared Errno' ++extras='' ++fflushNULL='define' ++fflushall='undef' ++find='' ++firstmakefile='makefile' ++flex='' ++fpossize='16' ++fpostype='fpos_t' ++freetype='void' ++from=':' ++full_ar='/usr/bin/ar' ++full_csh='csh' ++full_sed='/bin/sed' ++gccosandvers='' ++gccversion='3.3' ++getgrent_r_proto='0' ++getgrgid_r_proto='0' ++getgrnam_r_proto='0' ++gethostbyaddr_r_proto='0' ++gethostbyname_r_proto='0' ++gethostent_r_proto='0' ++getlogin_r_proto='0' ++getnetbyaddr_r_proto='0' ++getnetbyname_r_proto='0' ++getnetent_r_proto='0' ++getprotobyname_r_proto='0' ++getprotobynumber_r_proto='0' ++getprotoent_r_proto='0' ++getpwent_r_proto='0' ++getpwnam_r_proto='0' ++getpwuid_r_proto='0' ++getservbyname_r_proto='0' ++getservbyport_r_proto='0' ++getservent_r_proto='0' ++getspnam_r_proto='0' ++gidformat='"lu"' ++gidsign='1' ++gidsize='4' ++gidtype='gid_t' ++glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib /usr/ucblib /usr/local/lib ' ++gmake='gmake' ++gmtime_r_proto='0' ++gnulibc_version='' ++grep='grep' ++groupcat='cat /etc/group' ++groupstype='gid_t' ++gzip='gzip' ++h_fcntl='false' ++h_sysfile='true' ++hint='previous' ++hostcat='cat /etc/hosts' ++i16size='2' ++i16type='short' ++i32size='4' ++i32type='long' ++i64size='8' ++i64type='long long' ++i8size='1' ++i8type='char' ++i_arpainet='define' ++i_bsdioctl='' ++i_crypt='define' ++i_db='undef' ++i_dbm='undef' ++i_dirent='define' ++i_dld='undef' ++i_dlfcn='define' ++i_fcntl='undef' ++i_float='define' ++i_fp='undef' ++i_fp_class='undef' ++i_gdbm='undef' ++i_grp='define' ++i_ieeefp='undef' ++i_inttypes='define' ++i_langinfo='define' ++i_libutil='undef' ++i_limits='define' ++i_locale='define' ++i_machcthr='undef' ++i_malloc='define' ++i_math='define' ++i_memory='undef' ++i_mntent='define' ++i_ndbm='undef' ++i_netdb='define' ++i_neterrno='undef' ++i_netinettcp='define' ++i_niin='define' ++i_poll='define' ++i_prot='undef' ++i_pthread='define' ++i_pwd='define' ++i_rpcsvcdbm='undef' ++i_sfio='undef' ++i_sgtty='undef' ++i_shadow='define' ++i_socks='undef' ++i_stdarg='define' ++i_stddef='define' ++i_stdlib='define' ++i_string='define' ++i_sunmath='undef' ++i_sysaccess='undef' ++i_sysdir='define' ++i_sysfile='define' ++i_sysfilio='undef' ++i_sysin='undef' ++i_sysioctl='define' ++i_syslog='define' ++i_sysmman='define' ++i_sysmode='undef' ++i_sysmount='define' ++i_sysndir='undef' ++i_sysparam='define' ++i_sysresrc='define' ++i_syssecrt='undef' ++i_sysselct='define' ++i_syssockio='undef' ++i_sysstat='define' ++i_sysstatfs='define' ++i_sysstatvfs='define' ++i_systime='define' ++i_systimek='undef' ++i_systimes='define' ++i_systypes='define' ++i_sysuio='define' ++i_sysun='define' ++i_sysutsname='define' ++i_sysvfs='define' ++i_syswait='define' ++i_termio='undef' ++i_termios='define' ++i_time='define' ++i_unistd='define' ++i_ustat='undef' ++i_utime='define' ++i_values='define' ++i_varargs='undef' ++i_varhdr='stdarg.h' ++i_vfork='undef' ++ignore_versioned_solibs='y' ++inc_version_list=' ' ++inc_version_list_init='0' ++incpath='' ++inews='' ++installarchlib='./install_me_here/usr/lib/perl/5.8.0/TARGET_ARCH-linux' ++installbin='./install_me_here/usr/bin' ++installman1dir='' ++installman3dir='' ++installprefix='./install_me_here/usr/lib/perl/5.8.0' ++installprefixexp='./install_me_here/usr/lib/perl/5.8.0' ++installprivlib='./install_me_here/usr/lib/perl/5.8.0' ++installscript='./install_me_here/usr/bin' ++installsitearch='./install_me_here/usr/lib/perl/5.8.0/TARGET_ARCH-linux' ++installsitebin='./install_me_here/usr/bin' ++installsitelib='./install_me_here/usr/lib/perl/5.8.0' ++installstyle='lib' ++installusrbinperl='undef' ++installvendorarch='' ++installvendorbin='' ++installvendorlib='' ++intsize='4' ++issymlink='/usr/bin/test -h' ++ivdformat='"ld"' ++ivsize='4' ++ivtype='long' ++known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' ++ksh='' ++ld='TARGET_CROSScc' ++lddlflags='-shared' ++ldflags='' ++ldflags_uselargefiles='' ++ldlibpthname='LD_LIBRARY_PATH' ++less='less' ++lib_ext='.a' ++libc='/lib/libc.so.0' ++libperl='libperl.a' ++libpth='/lib /usr/lib' ++libs='-ldl -lm -lpthread -lc -lcrypt' ++libsdirs='' ++libsfiles='' ++libsfound='' ++libspath=' /lib /usr/lib' ++libswanted='sfio socket bind inet nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt sec ucb BSD PW x util' ++libswanted_uselargefiles='' ++line='' ++lint='' ++lkflags='' ++ln='ln' ++lns='/bin/ln -s' ++localtime_r_proto='0' ++locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include' ++loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib' ++longdblsize='8' ++longlongsize='8' ++longsize='4' ++lp='' ++lpr='' ++ls='ls' ++lseeksize='8' ++lseektype='off_t' ++mail='' ++mailx='' ++make='make' ++make_set_make='#' ++mallocobj='' ++mallocsrc='' ++malloctype='void *' ++man1dir=' ' ++man1direxp='' ++man1ext='0' ++man3dir=' ' ++man3direxp='' ++man3ext='0' ++mips_type='' ++mkdir='mkdir' ++mmaptype='void *' ++modetype='mode_t' ++more='more' ++multiarch='undef' ++mv='' ++myarchname='TARGET_ARCH-linux' ++n='-n' ++need_va_copy='undef' ++netdb_hlen_type='size_t' ++netdb_host_type='const void *' ++netdb_name_type='const char *' ++netdb_net_type='in_addr_t' ++nm='TARGET_CROSSnm' ++nm_opt='' ++nm_so_opt='--dynamic' ++nonxs_ext='Errno' ++nroff='nroff' ++nvEUformat='"E"' ++nvFUformat='"F"' ++nvGUformat='"G"' ++nv_preserves_uv_bits='32' ++nveformat='"e"' ++nvfformat='"f"' ++nvgformat='"g"' ++nvsize='8' ++nvtype='double' ++o_nonblock='O_NONBLOCK' ++obj_ext='.o' ++old_pthread_create_joinable='' ++optimize='-O2' ++orderlib='false' ++osname='linux' ++otherlibdirs=' ' ++package='perl5' ++pager='/bin/more' ++passcat='cat /etc/passwd' ++patchlevel='8' ++path_sep=':' ++perl5='' ++perl='' ++perl_patchlevel='' ++perllibs='-ldl -lm -lpthread -lc -lcrypt' ++perlpath='/usr/bin/perl' ++pg='pg' ++phostname='hostname' ++pidtype='pid_t' ++plibpth='' ++pm_apiversion='5.005' ++pmake='' ++pr='' ++prefix='/usr/lib/perl/5.8.0' ++prefixexp='/usr/lib/perl/5.8.0' ++privlib='/usr/lib/perl/5.8.0' ++privlibexp='/usr/lib/perl/5.8.0' ++procselfexe='"/proc/self/exe"' ++prototype='define' ++ptrsize='4' ++quadkind='3' ++quadtype='long long' ++randbits='48' ++randfunc='drand48' ++random_r_proto='0' ++randseedtype='long' ++ranlib='TARGET_CROSSranlib' ++rd_nodata='-1' ++readdir64_r_proto='0' ++readdir_r_proto='0' ++revision='5' ++rm='rm' ++rmail='' ++run='' ++runnm='true' ++sPRIEUldbl='"E"' ++sPRIFUldbl='"F"' ++sPRIGUldbl='"G"' ++sPRIXU64='"LX"' ++sPRId64='"Ld"' ++sPRIeldbl='"e"' ++sPRIfldbl='"f"' ++sPRIgldbl='"g"' ++sPRIi64='"Li"' ++sPRIo64='"Lo"' ++sPRIu64='"Lu"' ++sPRIx64='"Lx"' ++sSCNfldbl='"f"' ++sched_yield='sched_yield()' ++scriptdir='/usr/bin' ++scriptdirexp='/usr/bin' ++sed='sed' ++seedfunc='srand48' ++selectminbits='32' ++selecttype='fd_set *' ++sendmail='' ++setgrent_r_proto='0' ++sethostent_r_proto='0' ++setlocale_r_proto='0' ++setnetent_r_proto='0' ++setprotoent_r_proto='0' ++setpwent_r_proto='0' ++setservent_r_proto='0' ++sh='/bin/sh' ++shar='' ++sharpbang='#!' ++shmattype='void *' ++shortsize='2' ++shrpenv='' ++shsharp='true' ++sig_count='64' ++sig_name='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS RTMIN NUM33 NUM34 NUM35 NUM36 NUM37 NUM38 NUM39 NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 NUM48 NUM49 NUM50 NUM51 NUM52 NUM53 NUM54 NUM55 NUM56 NUM57 NUM58 NUM59 NUM60 NUM61 NUM62 RTMAX IOT CLD POLL UNUSED ' ++sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "SYS", "RTMIN", "NUM33", "NUM34", "NUM35", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41", "NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "NUM48", "NUM49", "NUM50", "NUM51", "NUM52", "NUM53", "NUM54", "NUM55", "NUM56", "NUM57", "NUM58", "NUM59", "NUM60", "NUM61", "NUM62", "RTMAX", "IOT", "CLD", "POLL", "UNUSED", 0' ++sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 6 17 29 31 ' ++sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0' ++sig_size='68' ++signal_t='void' ++sitearch='/usr/lib/perl/5.8.0/TARGET_ARCH-linux' ++sitearchexp='/usr/lib/perl/5.8.0/TARGET_ARCH-linux' ++sitebin='/usr/bin' ++sitebinexp='/usr/bin' ++sitelib='/usr/lib/perl/5.8.0' ++sitelib_stem='/usr/lib/perl/5.8.0/lib/site_perl' ++sitelibexp='/usr/lib/perl/5.8.0' ++siteprefix='/usr/lib/perl/5.8.0' ++siteprefixexp='/usr/lib/perl/5.8.0' ++sizesize='4' ++sizetype='size_t' ++sleep='' ++smail='' ++so='so' ++sockethdr='' ++socketlib='' ++socksizetype='socklen_t' ++sort='sort' ++spackage='Perl5' ++spitshell='cat' ++srand48_r_proto='0' ++srandom_r_proto='0' ++src='.' ++ssizetype='ssize_t' ++startperl='#!/usr/bin/perl' ++startsh='#!/bin/sh' ++static_ext=' ' ++stdchar='char' ++stdio_base='((fp)->_base)' ++stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)' ++stdio_cnt='((fp)->_cnt)' ++stdio_filbuf='' ++stdio_ptr='((fp)->_ptr)' ++stdio_stream_array='' ++strerror_r_proto='0' ++strings='/usr/include/string.h' ++submit='' ++subversion='0' ++sysman='/usr/man/man1' ++tail='' ++tar='' ++targetarch='' ++tbl='' ++tee='' ++test='test' ++timeincl='/usr/include/sys/time.h /usr/include/time.h ' ++timetype='time_t' ++tmpnam_r_proto='0' ++to=':' ++touch='touch' ++tr='tr' ++trnl='\n' ++troff='' ++ttyname_r_proto='0' ++u16size='2' ++u16type='unsigned short' ++u32size='4' ++u32type='unsigned long' ++u64size='8' ++u64type='unsigned long long' ++u8size='1' ++u8type='unsigned char' ++uidformat='"lu"' ++uidsign='1' ++uidsize='4' ++uidtype='uid_t' ++uname='uname' ++uniq='uniq' ++uquadtype='unsigned long long' ++use5005threads='undef' ++use64bitall='undef' ++use64bitint='undef' ++usecrosscompile='undef' ++usedl='define' ++useithreads='undef' ++uselargefiles='define' ++uselongdouble='undef' ++usemorebits='undef' ++usemultiplicity='undef' ++usemymalloc='n' ++usenm='true' ++useopcode='true' ++useperlio='define' ++useposix='true' ++usereentrant='undef' ++usesfio='false' ++useshrplib='false' ++usesocks='undef' ++usethreads='undef' ++usevendorprefix='undef' ++usevfork='false' ++usrinc='/usr/include' ++uuname='' ++uvXUformat='"lX"' ++uvoformat='"lo"' ++uvsize='4' ++uvtype='unsigned long' ++uvuformat='"lu"' ++uvxformat='"lx"' ++vendorarch='' ++vendorarchexp='' ++vendorbin='' ++vendorbinexp='' ++vendorlib='' ++vendorlib_stem='' ++vendorlibexp='' ++vendorprefix='' ++vendorprefixexp='' ++version='5.8.0' ++version_patchlevel_string='version 8 subversion 0' ++versiononly='undef' ++vi='' ++voidflags='15' ++xlibpth='/usr/lib/386 /lib/386' ++xs_apiversion='5.8.0' ++yacc='yacc' ++yaccflags='' ++zcat='' ++zip='zip' ++# Configure command line arguments. ++config_arg0='./Configure' ++config_args='-Dprefix=/usr/lib/perl/5.8.0 -Uinstallusrbinperl -des' ++config_argc=3 ++config_arg1='-Dprefix=/usr/lib/perl/5.8.0' ++config_arg2='-Uinstallusrbinperl' ++config_arg3='-des' ++PERL_REVISION=5 ++PERL_VERSION=8 ++PERL_SUBVERSION=0 ++PERL_API_REVISION=5 ++PERL_API_VERSION=8 ++PERL_API_SUBVERSION=0 ++PERL_PATCHLEVEL= ++PERL_CONFIG_SH=true ++# Variables propagated from previous config.sh file. ++siteman1='' ++siteman3='' ++sitescript='' diff --git a/obsolete-buildroot/sources/sedcheck.sh b/obsolete-buildroot/sources/sedcheck.sh new file mode 100755 index 0000000000..4d645b6ab0 --- /dev/null +++ b/obsolete-buildroot/sources/sedcheck.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +if [ -x /usr/bin/sed ]; then + SED="/usr/bin/sed"; +else + if [ -x /bin/sed ]; then + SED="/bin/sed"; + fi; +fi; + +echo "HELLO" > .sedtest +$SED -i -e "s/HELLO/GOODBYE/" .sedtest >/dev/null 2>&1 + +if [ $? != 0 ] ; then + echo build-sed-host-binary +else + echo use-sed-host-binary +fi; +rm -f .sedtest + + diff --git a/obsolete-buildroot/sources/skel.tar.gz b/obsolete-buildroot/sources/skel.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..301c5cfa2852d476b11725d9a4a77f2d1c3a8ff0 GIT binary patch literal 4846 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 KymaGqbpHo>QTcxW literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/specs-arm-soft-float b/obsolete-buildroot/sources/specs-arm-soft-float new file mode 100644 index 0000000000..3f726bd940 --- /dev/null +++ b/obsolete-buildroot/sources/specs-arm-soft-float @@ -0,0 +1,124 @@ +*asm: +%{mbig-endian:-EB} %{mlittle-endian:-EL} %{mcpu=*:-mcpu=%*} %{march=*:-march=%*} %{mapcs-*:-mapcs-%*} %(subtarget_asm_float_spec) %{mthumb-interwork:-mthumb-interwork} %(subtarget_extra_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: + + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(cpp_cpu_arch) %(subtarget_cpp_spec) %{mapcs-32:%{mapcs-26: %e-mapcs-26 and -mapcs-32 may not be used together}} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{mbig-endian:%{mlittle-endian: %e-mbig-endian and -mlittle-endian may not be used together}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} -auxbase%{c|S:%{o*:-strip %*}%{!o*: %b}}%{!c:%{!S: %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{h*} %{version:-v} %{b} %{Wl,*:%*} %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} -X %{mbig-endian:-EB} -m armelf_linux -p + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{!mhard-float:-lfloat} %{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:-lgcc_s%M}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.3 + +*multilib: +. ; + +*multilib_defaults: +marm mlittle-endian msoft-float mapcs-32 mno-thumb-interwork + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_cpu_arch: +%{march=arm2:-D__ARM_ARCH_2__} %{march=arm250:-D__ARM_ARCH_2__} %{march=arm3:-D__ARM_ARCH_2__} %{march=arm6:-D__ARM_ARCH_3__} %{march=arm600:-D__ARM_ARCH_3__} %{march=arm610:-D__ARM_ARCH_3__} %{march=arm7:-D__ARM_ARCH_3__} %{march=arm700:-D__ARM_ARCH_3__} %{march=arm710:-D__ARM_ARCH_3__} %{march=arm720:-D__ARM_ARCH_3__} %{march=arm7100:-D__ARM_ARCH_3__} %{march=arm7500:-D__ARM_ARCH_3__} %{march=arm7500fe:-D__ARM_ARCH_3__} %{march=arm7m:-D__ARM_ARCH_3M__} %{march=arm7dm:-D__ARM_ARCH_3M__} %{march=arm7dmi:-D__ARM_ARCH_3M__} %{march=arm7tdmi:-D__ARM_ARCH_4T__} %{march=arm8:-D__ARM_ARCH_4__} %{march=arm810:-D__ARM_ARCH_4__} %{march=arm9:-D__ARM_ARCH_4T__} %{march=arm920:-D__ARM_ARCH_4__} %{march=arm920t:-D__ARM_ARCH_4T__} %{march=arm9tdmi:-D__ARM_ARCH_4T__} %{march=strongarm:-D__ARM_ARCH_4__} %{march=strongarm110:-D__ARM_ARCH_4__} %{march=strongarm1100:-D__ARM_ARCH_4__} %{march=xscale:-D__ARM_ARCH_5TE__} %{march=xscale:-D__XSCALE__} %{march=armv2:-D__ARM_ARCH_2__} %{march=armv2a:-D__ARM_ARCH_2__} %{march=armv3:-D__ARM_ARCH_3__} %{march=armv3m:-D__ARM_ARCH_3M__} %{march=armv4:-D__ARM_ARCH_4__} %{march=armv4t:-D__ARM_ARCH_4T__} %{march=armv5:-D__ARM_ARCH_5__} %{march=armv5t:-D__ARM_ARCH_5T__} %{march=armv5e:-D__ARM_ARCH_5E__} %{march=armv5te:-D__ARM_ARCH_5TE__} %{!march=*: %{mcpu=arm2:-D__ARM_ARCH_2__} %{mcpu=arm250:-D__ARM_ARCH_2__} %{mcpu=arm3:-D__ARM_ARCH_2__} %{mcpu=arm6:-D__ARM_ARCH_3__} %{mcpu=arm600:-D__ARM_ARCH_3__} %{mcpu=arm610:-D__ARM_ARCH_3__} %{mcpu=arm7:-D__ARM_ARCH_3__} %{mcpu=arm700:-D__ARM_ARCH_3__} %{mcpu=arm710:-D__ARM_ARCH_3__} %{mcpu=arm720:-D__ARM_ARCH_3__} %{mcpu=arm7100:-D__ARM_ARCH_3__} %{mcpu=arm7500:-D__ARM_ARCH_3__} %{mcpu=arm7500fe:-D__ARM_ARCH_3__} %{mcpu=arm7m:-D__ARM_ARCH_3M__} %{mcpu=arm7dm:-D__ARM_ARCH_3M__} %{mcpu=arm7dmi:-D__ARM_ARCH_3M__} %{mcpu=arm7tdmi:-D__ARM_ARCH_4T__} %{mcpu=arm8:-D__ARM_ARCH_4__} %{mcpu=arm810:-D__ARM_ARCH_4__} %{mcpu=arm9:-D__ARM_ARCH_4T__} %{mcpu=arm920:-D__ARM_ARCH_4__} %{mcpu=arm920t:-D__ARM_ARCH_4T__} %{mcpu=arm9tdmi:-D__ARM_ARCH_4T__} %{mcpu=strongarm:-D__ARM_ARCH_4__} %{mcpu=strongarm110:-D__ARM_ARCH_4__} %{mcpu=strongarm1100:-D__ARM_ARCH_4__} %{mcpu=xscale:-D__ARM_ARCH_5TE__} %{mcpu=xscale:-D__XSCALE__} %{!mcpu*:%(cpp_cpu_arch_default)}} + +*cpp_cpu_arch_default: +-D__ARM_ARCH_4T__ + +*subtarget_cpp_spec: +%{posix:-D_POSIX_SOURCE} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} + +*subtarget_extra_asm_spec: + + +*subtarget_asm_float_spec: +%{mapcs-float:-mfloat} %{!mhard-float:-mno-fpu} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/obsolete-buildroot/sources/specs-mips-soft-float b/obsolete-buildroot/sources/specs-mips-soft-float new file mode 100644 index 0000000000..35fd671184 --- /dev/null +++ b/obsolete-buildroot/sources/specs-mips-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} -auxbase%{c|S:%{o*:-strip %*}%{!o*: %b}}%{!c:%{!S: %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.3 + +*multilib: +. ; + +*multilib_defaults: +EB mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EL:%{!mel:-EB}} %{EL|mel:-EL} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/obsolete-buildroot/sources/specs-mipsel-soft-float b/obsolete-buildroot/sources/specs-mipsel-soft-float new file mode 100644 index 0000000000..72aa2a62ef --- /dev/null +++ b/obsolete-buildroot/sources/specs-mipsel-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} -auxbase%{c|S:%{o*:-strip %*}%{!o*: %b}}%{!c:%{!S: %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.3 + +*multilib: +. ; + +*multilib_defaults: +EL mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EB:%{!meb:-EL}} %{EB|meb:-EB} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/obsolete-buildroot/sources/specs-powerpc-soft-float b/obsolete-buildroot/sources/specs-powerpc-soft-float new file mode 100644 index 0000000000..0cb9ed3a72 --- /dev/null +++ b/obsolete-buildroot/sources/specs-powerpc-soft-float @@ -0,0 +1,352 @@ +*asm: +%(asm_cpu) %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-freebsd: -mbig} %{mcall-i960-old: -mlittle} %{mcall-linux: -mbig} %{mcall-gnu: -mbig} %{mcall-netbsd: -mbig} }}}} + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%{posix: -D_POSIX_SOURCE} %(cpp_sysv) %{mads: %(cpp_os_ads) } %{myellowknife: %(cpp_os_yellowknife) } %{mmvme: %(cpp_os_mvme) } %{msim: %(cpp_os_sim) } %{mwindiss: %(cpp_os_windiss) } %{mcall-freebsd: %(cpp_os_freebsd) } %{mcall-linux: %(cpp_os_linux) } %{mcall-gnu: %(cpp_os_gnu) } %{mcall-netbsd: %(cpp_os_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{G*} %{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} %{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-aixdesc: -mbig %(cc1_endian_big) } %{mcall-freebsd: -mbig %(cc1_endian_big) } %{mcall-i960-old: -mlittle %(cc1_endian_little) } %{mcall-linux: -mbig %(cc1_endian_big) } %{mcall-gnu: -mbig %(cc1_endian_big) } %{mcall-netbsd: -mbig %(cc1_endian_big) } %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cc1_endian_default) }}}}}} }}}} %{mno-sdata: -msdata=none } %{meabi: %{!mcall-*: -mcall-sysv }} %{!meabi: %{!mno-eabi: %{mrelocatable: -meabi } %{mcall-freebsd: -mno-eabi } %{mcall-i960-old: -meabi } %{mcall-linux: -mno-eabi } %{mcall-gnu: -mno-eabi } %{mcall-netbsd: -mno-eabi }}} %{msdata: -msdata=default} %{mno-sdata: -msdata=none} %{profile: -p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} -auxbase%{c|S:%{o*:-strip %*}%{!o*: %b}}%{!c:%{!S: %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{mads: crtsavres.o%s %(endfile_ads)} %{myellowknife: crtsavres.o%s %(endfile_yellowknife)} %{mmvme: crtsavres.o%s %(endfile_mvme)} %{msim: crtsavres.o%s %(endfile_sim)} %{mwindiss: %(endfile_windiss)} %{mcall-freebsd: crtsavres.o%s %(endfile_freebsd) } %{mcall-linux: crtsavres.o%s %(endfile_linux) } %{mcall-gnu: crtsavres.o%s %(endfile_gnu) } %{mcall-netbsd: crtsavres.o%s %(endfile_netbsd) } %{mvxworks: crtsavres.o%s %(endfile_vxworks) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mvxworks: %(crtsavres_default) %(endfile_default) }}}}}}}}}} + +*link: +%{!static:--eh-frame-hdr} %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} %{YP,*} %{R*} %{Qy:} %{!Qn:-Qy} %(link_shlib) %{!Wl,-T*: %{!T*: %(link_start) }} %(link_target) %(link_os) + +*lib: +%{mads: %(lib_ads) } %{myellowknife: %(lib_yellowknife) } %{mmvme: %(lib_mvme) } %{msim: %(lib_sim) } %{mwindiss: %(lib_windiss) } %{mcall-freebsd: %(lib_freebsd) } %{mcall-linux: %(lib_linux) } %{mcall-gnu: %(lib_gnu) } %{mcall-netbsd: %(lib_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(lib_default) }}}}}}}}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{mads: %(startfile_ads) } %{myellowknife: %(startfile_yellowknife) } %{mmvme: %(startfile_mvme) } %{msim: %(startfile_sim) } %{mwindiss: %(startfile_windiss) } %{mcall-freebsd: %(startfile_freebsd) } %{mcall-linux: %(startfile_linux) } %{mcall-gnu: %(startfile_gnu) } %{mcall-netbsd: %(startfile_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(startfile_default) }}}}}}}}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.3 + +*multilib: +. mhard-float;nof !mhard-float; + +*multilib_defaults: +mbig mcall-sysv + +*multilib_extra: +fPIC mstrict-align + +*multilib_matches: +mcpu=401 msoft-float;mcpu=403 msoft-float;mcpu=405 msoft-float;mcpu=ec603e msoft-float;mcpu=801 msoft-float;mcpu=821 msoft-float;mcpu=823 msoft-float;mcpu=860 msoft-float;msoft-float msoft-float; + +*multilib_exclusions: + + +*multilib_options: +msoft-float + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_default: + + +*asm_cpu: +%{!mcpu*: %{mpower: %{!mpower2: -mpwr}} %{mpower2: -mpwrx} %{mpowerpc*: -mppc} %{mno-power: %{!mpowerpc*: -mcom}} %{!mno-power: %{!mpower2: %(asm_default)}}} %{mcpu=common: -mcom} %{mcpu=power: -mpwr} %{mcpu=power2: -mpwrx} %{mcpu=power3: -m604} %{mcpu=power4: -mpower4} %{mcpu=powerpc: -mppc} %{mcpu=rios: -mpwr} %{mcpu=rios1: -mpwr} %{mcpu=rios2: -mpwrx} %{mcpu=rsc: -mpwr} %{mcpu=rsc1: -mpwr} %{mcpu=401: -mppc} %{mcpu=403: -m403} %{mcpu=405: -m405} %{mcpu=505: -mppc} %{mcpu=601: -m601} %{mcpu=602: -mppc} %{mcpu=603: -mppc} %{mcpu=603e: -mppc} %{mcpu=ec603e: -mppc} %{mcpu=604: -mppc} %{mcpu=604e: -mppc} %{mcpu=620: -mppc} %{mcpu=630: -m604} %{mcpu=740: -mppc} %{mcpu=7400: -mppc} %{mcpu=7450: -mppc} %{mcpu=750: -mppc} %{mcpu=801: -mppc} %{mcpu=821: -mppc} %{mcpu=823: -mppc} %{mcpu=860: -mppc} %{mcpu=8540: -me500} %{maltivec: -maltivec} + +*asm_default: +-mppc + +*cpp_sysv: +%{mrelocatable*: -D_RELOCATABLE} %{fpic: -D__PIC__=1 -D__pic__=1} %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} + +*crtsavres_default: +crtsavres.o%s + +*lib_ads: +--start-group -lads -lc --end-group + +*lib_yellowknife: +--start-group -lyk -lc --end-group + +*lib_mvme: +--start-group -lmvme -lc --end-group + +*lib_sim: +--start-group -lsim -lc --end-group + +*lib_freebsd: + %{!shared: %{!pg: %{!pthread:-lc} %{pthread:-lc_r}} %{pg: %{!pthread:-lc_p} %{pthread:-lc_r_p}} } + +*lib_gnu: +%{mnewlib: --start-group -lgnu -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}} + +*lib_linux: +%{mnewlib: --start-group -llinux -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}} + +*lib_netbsd: +%{profile:-lgmon -lc_p} %{!profile:-lc} + +*lib_vxworks: + + +*lib_windiss: +--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group + +*lib_default: +%(lib_linux) + +*startfile_ads: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_yellowknife: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_mvme: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_sim: +ecrti.o%s sim-crt0.o%s crtbegin.o%s + +*startfile_freebsd: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_gnu: +%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_linux: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*startfile_netbsd: +ncrti.o%s crt0.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_vxworks: + + +*startfile_windiss: +crt0.o%s crtbegin.o%s + +*startfile_default: +%(startfile_linux) + +*endfile_ads: +crtend.o%s ecrtn.o%s + +*endfile_yellowknife: +crtend.o%s ecrtn.o%s + +*endfile_mvme: +crtend.o%s ecrtn.o%s + +*endfile_sim: +crtend.o%s ecrtn.o%s + +*endfile_freebsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*endfile_gnu: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_linux: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_netbsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} ncrtn.o%s + +*endfile_vxworks: + + +*endfile_windiss: +crtend.o%s + +*endfile_default: +%(endfile_linux) + +*link_path: + + +*link_shlib: +%{shared:-shared} %{!shared: %{static:-static}} + +*link_target: +%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-i960-old: --oformat elf32-powerpcle} }}}} + +*link_start: +%{mads: %(link_start_ads) } %{myellowknife: %(link_start_yellowknife) } %{mmvme: %(link_start_mvme) } %{msim: %(link_start_sim) } %{mwindiss: %(link_start_windiss) } %{mcall-freebsd: %(link_start_freebsd) } %{mcall-linux: %(link_start_linux) } %{mcall-gnu: %(link_start_gnu) } %{mcall-netbsd: %(link_start_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}}} + +*link_start_ads: +-T ads.ld%s + +*link_start_yellowknife: +-T yellowknife.ld%s + +*link_start_mvme: +-Ttext 0x40000 + +*link_start_sim: + + +*link_start_freebsd: + + +*link_start_gnu: + + +*link_start_linux: + + +*link_start_netbsd: + + +*link_start_vxworks: + + +*link_start_windiss: + + +*link_start_default: +%(link_start_linux) + +*link_os: +%{mads: %(link_os_ads) } %{myellowknife: %(link_os_yellowknife) } %{mmvme: %(link_os_mvme) } %{msim: %(link_os_sim) } %{mwindiss: %(link_os_windiss) } %{mcall-freebsd: %(link_os_freebsd) } %{mcall-linux: %(link_os_linux) } %{mcall-gnu: %(link_os_gnu) } %{mcall-netbsd: %(link_os_netbsd) } %{mcall-uclibc: %(link_os_linux_uclibc) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-uclibc: %(link_os_default) }}}}}}}}}} + +*link_os_ads: + + +*link_os_yellowknife: + + +*link_os_mvme: + + +*link_os_sim: +-m elf32ppcsim + +*link_os_freebsd: + %{p:%e`-p' not supported; use `-pg' and gprof(1)} %{Wl,*:%*} %{v:-V} %{assert*} %{R*} %{rpath*} %{defsym*} %{shared:-Bshareable %{h*} %{soname*}} %{!shared: %{!static: %{rdynamic: -export-dynamic} %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} %{static:-Bstatic}} %{symbolic:-Bsymbolic} + +*link_os_linux: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_gnu: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_netbsd: +%{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}} + +*link_os_vxworks: +-r + +*link_os_windiss: + + +*link_os_linux_uclibc: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} + +*link_os_default: +%(link_os_linux_uclibc) + +*cc1_endian_big: + + +*cc1_endian_little: +%{!mstrict-align: %{!mno-strict-align: %{!mcall-i960-old: -mstrict-align } }} + +*cc1_endian_default: +%(cc1_endian_big) + +*cpp_os_ads: + + +*cpp_os_yellowknife: + + +*cpp_os_mvme: + + +*cpp_os_sim: + + +*cpp_os_freebsd: + -D__ELF__ -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ -Acpu=powerpc -Amachine=powerpc + +*cpp_os_gnu: +-D__unix__ -D__gnu_hurd__ -D__GNU__ %{!undef: %{!ansi: -Dunix -D__unix}} -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_linux: +-D__unix__ -D__gnu_linux__ -D__linux__ %{!undef: %{!ansi: %{!std=*:-Dunix -D__unix -Dlinux -D__linux} %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_netbsd: +-D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ + +*cpp_os_rtems: +%{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }%{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } %{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } %{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } %{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } %{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } %{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } %{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } %{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } %{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } } + +*cpp_os_vxworks: +-DCPU_FAMILY=PPC %{!mcpu*: %{mpowerpc*: -DCPU=PPC603} %{!mno-powerpc: -DCPU=PPC603}} %{mcpu=powerpc: -DCPU=PPC603} %{mcpu=401: -DCPU=PPC403} %{mcpu=403: -DCPU=PPC403} %{mcpu=405: -DCPU=PPC405} %{mcpu=601: -DCPU=PPC601} %{mcpu=602: -DCPU=PPC603} %{mcpu=603: -DCPU=PPC603} %{mcpu=603e: -DCPU=PPC603} %{mcpu=ec603e: -DCPU=PPC603} %{mcpu=604: -DCPU=PPC604} %{mcpu=604e: -DCPU=PPC604} %{mcpu=620: -DCPU=PPC604} %{mcpu=740: -DCPU=PPC603} %{mcpu=7450: -DCPU=PPC603} %{mcpu=750: -DCPU=PPC603} %{mcpu=801: -DCPU=PPC603} %{mcpu=821: -DCPU=PPC603} %{mcpu=823: -DCPU=PPC603} %{mcpu=860: -DCPU=PPC603} + +*cpp_os_windiss: +-D__rtasim -D__EABI__ -D__ppc %{!msoft-float: -D__hardfp} + +*cpp_os_default: +%(cpp_os_linux) + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/obsolete-buildroot/sources/squashfs.patch b/obsolete-buildroot/sources/squashfs.patch new file mode 100644 index 0000000000..ea75a7f18a --- /dev/null +++ b/obsolete-buildroot/sources/squashfs.patch @@ -0,0 +1,36 @@ +This is a stupid little patch adding an option to change all uid/gid to +root/root in the generated filesystem. We really need to teach mksquashfs +about device tables though... + +--- squashfs1.3r3/squashfs-tools/mksquashfs.c-dist 2004-03-29 20:35:37.000000000 -0600 ++++ squashfs1.3r3/squashfs-tools/mksquashfs.c 2004-03-29 22:28:51.000000000 -0600 +@@ -136,6 +136,8 @@ + stotal_bytes, stotal_inode_bytes, stotal_directory_bytes, sinode_count, sfile_count, ssym_count, sdev_count, sdir_count, sdup_files; + int restore = 0; + ++unsigned int root_owned = 0; ++ + /*flag whether destination file is a block device */ + int block_device = 0; + +@@ -421,6 +423,11 @@ + return SQUASHFS_INVALID; + } + ++ if (root_owned) { ++ buf.st_uid = 0; ++ buf.st_gid = 0; ++ } ++ + base->mode = SQUASHFS_MODE(buf.st_mode); + base->uid = get_uid(&file_type, (squashfs_uid) buf.st_uid); + base->inode_type = file_type; +@@ -1268,6 +1275,8 @@ + root_name = argv[i]; + } else if(strcmp(argv[i], "-version") == 0) { + VERSION(); ++ } else if (strcmp(argv[i], "-root-owned") == 0) { ++ root_owned = TRUE; + } else { + ERROR("%s: invalid option\n\n", argv[0]); + printOptions: diff --git a/obsolete-buildroot/sources/target_skeleton/etc/TZ b/obsolete-buildroot/sources/target_skeleton/etc/TZ new file mode 100644 index 0000000000..9fcb2a3c56 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/TZ @@ -0,0 +1 @@ +MST7MDT diff --git a/obsolete-buildroot/sources/target_skeleton/etc/fstab b/obsolete-buildroot/sources/target_skeleton/etc/fstab new file mode 100644 index 0000000000..6d33629a7b --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/fstab @@ -0,0 +1,8 @@ +# /etc/fstab: static file system information. +# +# +/dev/root / ext2 rw,noauto 0 1 +proc /proc proc defaults 0 0 +devpts /dev/pts devpts defaults,gid=5,mode=620 0 0 +tmpfs /tmp tmpfs defaults 0 0 + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/group b/obsolete-buildroot/sources/target_skeleton/etc/group new file mode 100644 index 0000000000..a21ef0f769 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/group @@ -0,0 +1,10 @@ +root:x:0: +daemon:x:1: +bin:x:2: +sys:x:3: +adm:x:4: +tty:x:5: +disk:x:6: +utmp:x:43: +staff:x:50: +default:x:1000: diff --git a/obsolete-buildroot/sources/target_skeleton/etc/hostname b/obsolete-buildroot/sources/target_skeleton/etc/hostname new file mode 100644 index 0000000000..52e67d68aa --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/hostname @@ -0,0 +1 @@ +uclibc diff --git a/obsolete-buildroot/sources/target_skeleton/etc/hosts b/obsolete-buildroot/sources/target_skeleton/etc/hosts new file mode 100644 index 0000000000..ba712fe033 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/hosts @@ -0,0 +1 @@ +127.0.0.1 localhost diff --git a/obsolete-buildroot/sources/target_skeleton/etc/init.d/S20urandom b/obsolete-buildroot/sources/target_skeleton/etc/init.d/S20urandom new file mode 100755 index 0000000000..433fafee4e --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/init.d/S20urandom @@ -0,0 +1,44 @@ +#! /bin/sh +# +# urandom This script saves the random seed between reboots. +# It is called from the boot, halt and reboot scripts. +# +# Version: @(#)urandom 1.33 22-Jun-1998 miquels@cistron.nl +# + +[ -c /dev/urandom ] || exit 0 +#. /etc/default/rcS + +case "$1" in + start|"") + if [ "$VERBOSE" != no ] + then + echo -n "Initializing random number generator... " + fi + # Load and then save 512 bytes, + # which is the size of the entropy pool + if [ -f /etc/random-seed ] + then + cat /etc/random-seed >/dev/urandom + fi + rm -f /etc/random-seed + umask 077 + dd if=/dev/urandom of=/etc/random-seed count=1 \ + >/dev/null 2>&1 || echo "urandom start: failed." + umask 022 + [ "$VERBOSE" != no ] && echo "done." + ;; + stop) + # Carry a random seed from shut-down to start-up; + # see documentation in linux/drivers/char/random.c + [ "$VERBOSE" != no ] && echo -n "Saving random seed... " + umask 077 + dd if=/dev/urandom of=/etc/random-seed count=1 \ + >/dev/null 2>&1 || echo "urandom stop: failed." + [ "$VERBOSE" != no ] && echo "done." + ;; + *) + echo "Usage: urandom {start|stop}" >&2 + exit 1 + ;; +esac diff --git a/obsolete-buildroot/sources/target_skeleton/etc/init.d/S40network b/obsolete-buildroot/sources/target_skeleton/etc/init.d/S40network new file mode 100755 index 0000000000..d835d9c72a --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/init.d/S40network @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Start the network.... +# + +start() { + echo "Starting network..." + /sbin/ifup -a +} +stop() { + echo -n "Stopping network..." + /sbin/ifdown -a +} +restart() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|restart}" + exit 1 +esac + +exit $? + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/init.d/rcS b/obsolete-buildroot/sources/target_skeleton/etc/init.d/rcS new file mode 100755 index 0000000000..de411534da --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/init.d/rcS @@ -0,0 +1,27 @@ +#!/bin/sh + + +# Start all init scripts in /etc/init.d +# executing them in numerical order. +# +for i in /etc/init.d/S??* ;do + + # Ignore dangling symlinks (if any). + [ ! -f "$i" ] && continue + + case "$i" in + *.sh) + # Source shell script for speed. + ( + trap - INT QUIT TSTP + set start + . $i + ) + ;; + *) + # No sh extension, so fork subprocess. + $i start + ;; + esac +done + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/inittab b/obsolete-buildroot/sources/target_skeleton/etc/inittab new file mode 100644 index 0000000000..a6c014e751 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/inittab @@ -0,0 +1,47 @@ +# /etc/inittab +# +# Copyright (C) 2001 Erik Andersen +# +# Note: BusyBox init doesn't support runlevels. The runlevels field is +# completely ignored by BusyBox init. If you want runlevels, use +# sysvinit. +# +# Format for each entry: ::: +# +# id == tty to run on, or empty for /dev/console +# runlevels == ignored +# action == one of sysinit, respawn, askfirst, wait, and once +# process == program to run + +# Startup the system +null::sysinit:/bin/mount -o remount,rw / +null::sysinit:/bin/mount -t proc proc /proc +null::sysinit:/bin/mount -a +null::sysinit:/bin/hostname -F /etc/hostname +null::sysinit:/sbin/ifconfig lo 127.0.0.1 up +null::sysinit:/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo +# now run any rc scripts +::sysinit:/etc/init.d/rcS + +# Set up a couple of getty's +tty1::respawn:/sbin/getty 38400 tty1 +tty2::respawn:/sbin/getty 38400 tty2 + +# Put a getty on the serial port +#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 + +# Logging junk +null::sysinit:/bin/touch /var/log/messages +null::respawn:/sbin/syslogd -n -m 0 +null::respawn:/sbin/klogd -n +tty3::respawn:/usr/bin/tail -f /var/log/messages + +# Stuff to do for the 3-finger salute +::ctrlaltdel:/sbin/reboot + +# Stuff to do before rebooting +null::shutdown:/usr/bin/killall klogd +null::shutdown:/usr/bin/killall syslogd +null::shutdown:/bin/umount -a -r +null::shutdown:/sbin/swapoff -a + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/inputrc b/obsolete-buildroot/sources/target_skeleton/etc/inputrc new file mode 100644 index 0000000000..2f1cb601a5 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/inputrc @@ -0,0 +1,44 @@ +# /etc/inputrc - global inputrc for libreadline +# See readline(3readline) and `info readline' for more information. + +# Be 8 bit clean. +set input-meta on +set output-meta on +set bell-style visible + +# To allow the use of 8bit-characters like the german umlauts, comment out +# the line below. However this makes the meta key not work as a meta key, +# which is annoying to those which don't need to type in 8-bit characters. + +# set convert-meta off + +"\e0d": backward-word +"\e0c": forward-word +"\e[h": beginning-of-line +"\e[f": end-of-line +"\e[1~": beginning-of-line +"\e[4~": end-of-line +#"\e[5~": beginning-of-history +#"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert + +# Common standard keypad and cursor +# (codes courtsey Werner Fink, ) +#"\e[1~": history-search-backward +"\e[2~": yank +"\e[3~": delete-char +#"\e[4~": set-mark +"\e[5~": history-search-backward +"\e[6~": history-search-forward +# Normal keypad and cursor of xterm +"\e[F": end-of-line +"\e[H": beginning-of-line +# Application keypad and cursor of xterm +"\eOA": previous-history +"\eOC": forward-char +"\eOB": next-history +"\eOD": backward-char +"\eOF": end-of-line +"\eOH": beginning-of-line + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/issue b/obsolete-buildroot/sources/target_skeleton/etc/issue new file mode 100644 index 0000000000..f24b862c97 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/issue @@ -0,0 +1,4 @@ + + +Welcome to the Erik's uClibc development environment. + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/network/interfaces b/obsolete-buildroot/sources/target_skeleton/etc/network/interfaces new file mode 100644 index 0000000000..218b82cde5 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/network/interfaces @@ -0,0 +1,4 @@ +# Configure Loopback +auto lo +iface lo inet loopback + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/passwd b/obsolete-buildroot/sources/target_skeleton/etc/passwd new file mode 100644 index 0000000000..e0f473fc7b --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/passwd @@ -0,0 +1,13 @@ +root:x:0:0:root:/root:/bin/sh +daemon:x:1:1:daemon:/usr/sbin:/bin/sh +bin:x:2:2:bin:/bin:/bin/sh +sys:x:3:3:sys:/dev:/bin/sh +sync:x:4:100:sync:/bin:/bin/sync +mail:x:8:8:mail:/var/spool/mail:/bin/sh +proxy:x:13:13:proxy:/bin:/bin/sh +www-data:x:33:33:www-data:/var/www:/bin/sh +backup:x:34:34:backup:/var/backups:/bin/sh +operator:x:37:37:Operator:/var:/bin/sh +sshd:x:103:99:Operator:/var:/bin/sh +nobody:x:99:99:nobody:/home:/bin/sh +default:x:1000:1000:Default non-root user:/home/default:/bin/sh diff --git a/obsolete-buildroot/sources/target_skeleton/etc/profile b/obsolete-buildroot/sources/target_skeleton/etc/profile new file mode 100644 index 0000000000..cc2e0beb87 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/profile @@ -0,0 +1,48 @@ +# ~/.bashrc: executed by bash(1) for non-login interactive shells. + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +# If running interactively, then: +if [ "$PS1" ]; then + + if [ "$BASH" ]; then + export PS1="[\u@\h \W]\\$ " + alias ll='/bin/ls --color=tty -laFh' + alias ls='/bin/ls --color=tty -F' + export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:'; + else + if [ "`id -u`" -eq 0 ]; then + export PS1='# ' + else + export PS1='$ ' + fi + fi + + export USER=`id -un` + export LOGNAME=$USER + export HOSTNAME=`/bin/hostname` + export HISTSIZE=1000 + export HISTFILESIZE=1000 + export PAGER='/bin/more ' + export EDITOR='/bin/vi' + export INPUTRC=/etc/inputrc + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + + ### Some aliases + alias ps2='ps facux ' + alias ps1='ps faxo "%U %t %p %a" ' + alias af='ps af' + alias cls='clear' + alias df='df -h' + alias indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' + #alias bc='bc -l' + alias minicom='minicom -c on' + alias calc='calc -Cd ' + alias bc='calc -Cd ' +fi; diff --git a/obsolete-buildroot/sources/target_skeleton/etc/protocols b/obsolete-buildroot/sources/target_skeleton/etc/protocols new file mode 100644 index 0000000000..98f9f2d30e --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/protocols @@ -0,0 +1,31 @@ +# /etc/protocols: +# $Id$ +# +# Internet (IP) protocols +# +# from: @(#)protocols 5.1 (Berkeley) 4/17/89 +# +# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992). + +ip 0 IP # internet protocol, pseudo protocol number +icmp 1 ICMP # internet control message protocol +igmp 2 IGMP # Internet Group Management +ggp 3 GGP # gateway-gateway protocol +ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'') +st 5 ST # ST datagram mode +tcp 6 TCP # transmission control protocol +egp 8 EGP # exterior gateway protocol +pup 12 PUP # PARC universal packet protocol +udp 17 UDP # user datagram protocol +hmp 20 HMP # host monitoring protocol +xns-idp 22 XNS-IDP # Xerox NS IDP +rdp 27 RDP # "reliable datagram" protocol +iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4 +xtp 36 XTP # Xpress Tranfer Protocol +ddp 37 DDP # Datagram Delivery Protocol +idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport +rspf 73 RSPF #Radio Shortest Path First. +vmtp 81 VMTP # Versatile Message Transport +ospf 89 OSPFIGP # Open Shortest Path First IGP +ipip 94 IPIP # Yet Another IP encapsulation +encap 98 ENCAP # Yet Another IP encapsulation diff --git a/obsolete-buildroot/sources/target_skeleton/etc/random-seed b/obsolete-buildroot/sources/target_skeleton/etc/random-seed new file mode 100644 index 0000000000000000000000000000000000000000..fbc7352fbb40c3cab0441fad743cf61c5342d51c GIT binary patch literal 512 zcmV+b0{{Iq0UOB42;n4xpAvJIL$H4mg*!B4&9jh)7+B2j-fX7o@K*bzj;pJ$FwoQzl&MuZ^Wy zrYS)x9vq<)#e~&1uB|_ITW-fntEg1^KXs3>vvgL7?_kg!+6=fg{R%Utkr$#pmPZ13liCc zi|M+im&71p*p+Z|7f(m-aedNFtEezFN-nZHytAhV~}?OM$-f$(%cG(ioV{==Ub4mfZP}OaJJ7 z25tvCcku=>;L?}O-dvK9`}<^gmg@IrnfQm#P>RRF|C9c;GDgEg_bw26{dkIVt1`{` z3#ol{Q_FL91TBD~{uZnRRZ(Otf!KXM&;q)8B The Registered Ports are not controlled by the IANA and on most systems +#> can be used by ordinary user processes or programs executed by ordinary +#> users. +# +#> Ports are used in the TCP [45,106] to name the ends of logical +#> connections which carry long term conversations. For the purpose of +#> providing services to unknown callers, a service contact port is +#> defined. This list specifies the port used by the server process as its +#> contact port. While the IANA can not control uses of these ports it +#> does register or list uses of these ports as a convienence to the +#> community. +# +nfsdstatus 1110/tcp +nfsd-keepalive 1110/udp + +ingreslock 1524/tcp +ingreslock 1524/udp +prospero-np 1525/tcp # Prospero non-privileged +prospero-np 1525/udp +datametrics 1645/tcp old-radius # datametrics / old radius entry +datametrics 1645/udp old-radius # datametrics / old radius entry +sa-msg-port 1646/tcp old-radacct # sa-msg-port / old radacct entry +sa-msg-port 1646/udp old-radacct # sa-msg-port / old radacct entry +radius 1812/tcp # Radius +radius 1812/udp # Radius +radacct 1813/tcp # Radius Accounting +radacct 1813/udp # Radius Accounting +nfsd 2049/tcp nfs +nfsd 2049/udp nfs +cvspserver 2401/tcp # CVS client/server operations +cvspserver 2401/udp # CVS client/server operations +mysql 3306/tcp # MySQL +mysql 3306/udp # MySQL +rfe 5002/tcp # Radio Free Ethernet +rfe 5002/udp # Actually uses UDP only +cfengine 5308/tcp # CFengine +cfengine 5308/udp # CFengine +bbs 7000/tcp # BBS service +# +# +# Kerberos (Project Athena/MIT) services +# Note that these are for Kerberos v4, and are unofficial. Sites running +# v4 should uncomment these and comment out the v5 entries above. +# +kerberos4 750/udp kerberos-iv kdc # Kerberos (server) udp +kerberos4 750/tcp kerberos-iv kdc # Kerberos (server) tcp +kerberos_master 751/udp # Kerberos authentication +kerberos_master 751/tcp # Kerberos authentication +passwd_server 752/udp # Kerberos passwd server +krb_prop 754/tcp # Kerberos slave propagation +krbupdate 760/tcp kreg # Kerberos registration +kpasswd 761/tcp kpwd # Kerberos "passwd" +kpop 1109/tcp # Pop with Kerberos +knetd 2053/tcp # Kerberos de-multiplexor +zephyr-srv 2102/udp # Zephyr server +zephyr-clt 2103/udp # Zephyr serv-hm connection +zephyr-hm 2104/udp # Zephyr hostmanager +eklogin 2105/tcp # Kerberos encrypted rlogin +# +# Unofficial but necessary (for NetBSD) services +# +supfilesrv 871/tcp # SUP server +supfiledbg 1127/tcp # SUP debugging +# +# Datagram Delivery Protocol services +# +rtmp 1/ddp # Routing Table Maintenance Protocol +nbp 2/ddp # Name Binding Protocol +echo 4/ddp # AppleTalk Echo Protocol +zip 6/ddp # Zone Information Protocol +# +# Services added for the Debian GNU/Linux distribution +poppassd 106/tcp # Eudora +poppassd 106/udp # Eudora +mailq 174/tcp # Mailer transport queue for Zmailer +mailq 174/tcp # Mailer transport queue for Zmailer +omirr 808/tcp omirrd # online mirror +omirr 808/udp omirrd # online mirror +rmtcfg 1236/tcp # Gracilis Packeten remote config server +xtel 1313/tcp # french minitel +coda_opcons 1355/udp # Coda opcons (Coda fs) +coda_venus 1363/udp # Coda venus (Coda fs) +coda_auth 1357/udp # Coda auth (Coda fs) +coda_udpsrv 1359/udp # Coda udpsrv (Coda fs) +coda_filesrv 1361/udp # Coda filesrv (Coda fs) +codacon 1423/tcp venus.cmu # Coda Console (Coda fs) +coda_aux1 1431/tcp # coda auxiliary service (Coda fs) +coda_aux1 1431/udp # coda auxiliary service (Coda fs) +coda_aux2 1433/tcp # coda auxiliary service (Coda fs) +coda_aux2 1433/udp # coda auxiliary service (Coda fs) +coda_aux3 1435/tcp # coda auxiliary service (Coda fs) +coda_aux3 1435/udp # coda auxiliary service (Coda fs) +cfinger 2003/tcp # GNU Finger +afbackup 2988/tcp # Afbackup system +afbackup 2988/udp # Afbackup system +icp 3130/tcp # Internet Cache Protocol (Squid) +icp 3130/udp # Internet Cache Protocol (Squid) +postgres 5432/tcp # POSTGRES +postgres 5432/udp # POSTGRES +fax 4557/tcp # FAX transmission service (old) +hylafax 4559/tcp # HylaFAX client-server protocol (new) +noclog 5354/tcp # noclogd with TCP (nocol) +noclog 5354/udp # noclogd with UDP (nocol) +hostmon 5355/tcp # hostmon uses TCP (nocol) +hostmon 5355/udp # hostmon uses TCP (nocol) +ircd 6667/tcp # Internet Relay Chat +ircd 6667/udp # Internet Relay Chat +webcache 8080/tcp # WWW caching service +webcache 8080/udp # WWW caching service +tproxy 8081/tcp # Transparent Proxy +tproxy 8081/udp # Transparent Proxy +mandelspawn 9359/udp mandelbrot # network mandelbrot +amanda 10080/udp # amanda backup services +amandaidx 10082/tcp # amanda backup services +amidxtape 10083/tcp # amanda backup services +isdnlog 20011/tcp # isdn logging system +isdnlog 20011/udp # isdn logging system +vboxd 20012/tcp # voice box system +vboxd 20012/udp # voice box system +binkp 24554/tcp # Binkley +binkp 24554/udp # Binkley +asp 27374/tcp # Address Search Protocol +asp 27374/udp # Address Search Protocol +tfido 60177/tcp # Ifmail +tfido 60177/udp # Ifmail +fido 60179/tcp # Ifmail +fido 60179/udp # Ifmail + +# Local services + diff --git a/obsolete-buildroot/sources/target_skeleton/etc/shadow b/obsolete-buildroot/sources/target_skeleton/etc/shadow new file mode 100644 index 0000000000..4941a1ac53 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/etc/shadow @@ -0,0 +1,12 @@ +root::10933:0:99999:7::: +bin:*:10933:0:99999:7::: +daemon:*:10933:0:99999:7::: +adm:*:10933:0:99999:7::: +lp:*:10933:0:99999:7::: +sync:*:10933:0:99999:7::: +shutdown:*:10933:0:99999:7::: +halt:*:10933:0:99999:7::: +uucp:*:10933:0:99999:7::: +operator:*:10933:0:99999:7::: +nobody:*:10933:0:99999:7::: +default::10933:0:99999:7::: diff --git a/obsolete-buildroot/sources/target_skeleton/root/.bash_history b/obsolete-buildroot/sources/target_skeleton/root/.bash_history new file mode 100644 index 0000000000..e69de29bb2 diff --git a/obsolete-buildroot/sources/target_skeleton/root/.bash_logout b/obsolete-buildroot/sources/target_skeleton/root/.bash_logout new file mode 100644 index 0000000000..77ef1f9508 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/root/.bash_logout @@ -0,0 +1,7 @@ +# ~/.bash_logout: executed by bash(1) when login shell exits. + +# when leaving the console clear the screen to increase privacy + +case "`tty`" in + /dev/tty[0-9]*) clear +esac diff --git a/obsolete-buildroot/sources/target_skeleton/root/.bash_profile b/obsolete-buildroot/sources/target_skeleton/root/.bash_profile new file mode 100644 index 0000000000..27bf14953d --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/root/.bash_profile @@ -0,0 +1,15 @@ +# .bash_profile + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +umask 022 + +if [ -f ~/.bashrc ]; then + source ~/.bashrc +fi diff --git a/obsolete-buildroot/sources/target_skeleton/root/.bashrc b/obsolete-buildroot/sources/target_skeleton/root/.bashrc new file mode 100644 index 0000000000..d13c8f9026 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/root/.bashrc @@ -0,0 +1,48 @@ +# ~/.bashrc: executed by bash(1) for non-login interactive shells. + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +# If running interactively, then: +if [ "$PS1" ]; then + + if [ "$BASH" ]; then + export PS1="[\u@\h \W]\\$ " + else + if [ "`id -u`" -eq 0 ]; then + export PS1='# ' + else + export PS1='$ ' + fi + fi + + export USER=`id -un` + export LOGNAME=$USER + export HOSTNAME=`/bin/hostname` + export HISTSIZE=1000 + export HISTFILESIZE=1000 + export PAGER='/bin/more ' + export EDITOR='/bin/vi' + export INPUTRC=/etc/inputrc + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:'; + + ### Some aliases + alias ps2='ps facux ' + alias ps1='ps faxo "%U %t %p %a" ' + alias af='ps af' + alias cls='clear' + alias ll='/bin/ls --color=tty -laFh' + alias ls='/bin/ls --color=tty -F' + alias df='df -h' + alias indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' + #alias bc='bc -l' + alias minicom='minicom -c on' + alias calc='calc -Cd ' + alias bc='calc -Cd ' +fi; diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/a/ansi b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/a/ansi new file mode 100644 index 0000000000000000000000000000000000000000..d1e14008c5b102878b914b58343dad09d75a7f21 GIT binary patch literal 1450 zcmds$O=uHQ5Xa}O#fJ7$Az*8y^s*RjquFHh#j1%KFlq`#dyoXFX|}ej`7(*N+NR*i zqX!WM>%oHu4}wL#c=4n0=2cJ&dQkA_=Rq&V|LkUy9IW6;aN$4mdo%Oqy`4=q2{&z| zKB|ehlqpn<1vWcMSx-^QBDHn9NNL%^KAitaHUOk)ZY??1i8)a!@}te)Bje zM(ePri`FCWpdNCfax-`fg=r^z%-k1;O+ZQX;x^-yq6w3DrGpGAP=)5`0$pszFVW>z z1y}KN6_M*5(Hk9XRdm{$bPM_0&6+z+zx>BNjm87yAJPgvrx)~wKF}xnL6Ybdc4wy; z5QD8%qu~SZf}-LI?6r=Jy@UM{;;U=qI_v%~e*2ei{9b$%-$b|6EB(7UIHken>27I6 z@=EF&cL__oC09B{-T2kJ(!Ob!ge!dz?hwRYHsq2b>-*cN$t9nxClJ^Rv5!OhpgqtS zGzuw79yY+nq%c#cWmG1!^HHww^3tnWo|%=zU$%Wn65Kwh$CW;UfZ2hMG-1>RzL*(_ z+0ZKHHfD-@nZP$UVcZ6O57mGP7{r+@7x?6Pr6zl1eUi(psp#g|_}+4q3#(d4));+2 z)k1$essaO6Gze5I3<1LyMmUNv-k#@rfQI`3X?dnW(OuxqtS_?9;h>=f0l*GXHMjWo>EkCt9Q+g})_ktZTA<7#J+T tMCG*RReXLm5DbMQ$Fc~q{1Hu!@bLZSNSIWc+!*UtXd5&PHNP=`v|lT3JNf_s literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/d/dumb b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/d/dumb new file mode 100644 index 0000000000000000000000000000000000000000..ffdc8acf34bed25a78f4a019267bfca72f716179 GIT binary patch literal 308 zcmb1Qlwe?DU}R`w;9y88%}uJYFwjlT&neB#Qvh)lN=hmj7#IT>{{LqHs{4-ySTID; P6bvIS8v{E77Z?Hn(+>pZ literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/l/linux b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/l/linux new file mode 100644 index 0000000000000000000000000000000000000000..e9ec115d5c584a45dedfa30384ced55125c985d9 GIT binary patch literal 1551 zcmb_cOGs2v82-<}$ZAnSQ8@?|T_UWUd+xpSV5~7qoKhpiML2}UOg_i){U~*kAc7zw zXj8O`7Old_Hnk|twryJUkQO~~Q7a1~2%5hC+?lboNU6j8-~avp`Q|*nIZUBgPertr zM#X)ZXifGHjcD8w>rD1`CQcFwd=PqMNUo%GIv?@7kxylqA(E6w8>o=Bl0iGsv8jS8 zsfudB>nI9rK*XpSm`=A-Hw|buOk;Eo>;he)D|D4^&@J5`r+f5(CNt&;C zl8Jv@ap4Zxx@Vc|4$8Cgyu2tcFY|lZ{r*S3CT}ij_uFzpuB6rEi5jg&mubX9Mwc?; zJ!n|XfQTo07^w=uIU}l^r>;Jtmx!PpR!)NQUDASd0I?r&6j6gP%?_Z$pqXN3vogTU zp97njKGHD|)61ndwd19X9wd4tK$Mrc* z9zUDLYQB~cW@%r@Z-kgCP}`-}eAfnb+^z$vTW6{4l5Y4gZzVA+COG?j=3+0AHom(k1vV< literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/r/rxvt b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/r/rxvt new file mode 100644 index 0000000000000000000000000000000000000000..ba6987a1a8ae0e70a6f1f4f24a1ee3f1c79dcff6 GIT binary patch literal 1627 zcmbVL&r4KM6h8NAr4b5&5k87ZnjDM5d2hy127gvC_ydiQGC>q)97o^GI6rj!H7*Ql zk&B{&Xc28Hh!)Z!Y7+#l+SH~^ix&L{1uY_I`p%iBW+tJRIp6utch9|Z@AuxTR%hr4 zRZ>Egm!xNBvWpC^Y$P3zB}QylBtC7AWRq!^=d$ZkED=uTTo>mu*+{&ONa4pp7)&?` za_*xtI!uLsj52D2PNb=ns;HW3=!Ep0q#!j@JB3hn(gk2Y4bU)!Wp!x{bxhT&)5=m!s#Tp= zU8)ar{fGfIq(+f>MAf89IJ~HA#gv*?SJeu-?y3js3G(V+D_*HjqWl6XU8?tLoC0wG zQ5+TepgyFl^-)o3fc@)p+%d4JVr5uIpvAW6Jh%Nwpg*H$*H`7imZiD|yy56Koy_~( z(f9R3{a8QK&-F|FTEErr{+QkVpLRa;VVC=U+~vBRpKxQvXXih^=x+{FC3{Nt(S9-p z-7)u+*BuVJr%ZP^4Z(^6LdKxkiQI+Yys0ZB3qz1wO}~xrN60wRSw#Cr*$3J~6+nL+ z-~|NG>kDwNk0HRifG>`Z+Zc>9n4QvP8;vM@HY?I&q6stpaR!#Lm2EU5d$~$ud2un0 z-x}a9Z_o<*f(^E_O&hwp<-pbwXa}Nk2w-}-^a?uM6h+#+KH+}BfMBCw6QfzrD6*_M zhpK@k>31AyA)^_RSk0~o=~*Lu4pI1gLb}%o?|6+) z|FOcrdEjk;A0$o@qH;2NbBH;_G$Mt_(D3lc$kj`TP=J`wAJJ4x_FflwIoOTZ*yPaWJv6ky(HtjA&ruXBb78 zV!0`OrdVi-o2FQ9ise>uKe5}AeyjM1_;t0Kg1#nxPuA>RuTp>|m{@)+s$O I-cwJ%0l%&O@&Et; literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/screen b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/screen new file mode 100644 index 0000000000000000000000000000000000000000..8f4206c81e6bb6dd8e0e7cc01cc0699d7d095c4f GIT binary patch literal 1318 zcmc&zJ8aWX6g>|REg(@gK9(RtibP3M{7ciQ>X(87ZAhUNittjaO%o?}>N=mM`ILnP zF|aT(Au%u@76t|e!~hZ!EHEJkrcMm7Ft8wV--|P#bYMZXe9t-ey!)>2dy-GF^BBM} zSnNA1uXx#PsdaNHq{#Ax>1&HuLK$s%L=V+0uTnMbP$la*R>`yhCSFb?7#7fv6YzI= z`Z0z5RCE9bspce3BaA^&8N~#x&0>zS6qX1xFkm7pRxK3a3g!D%!42HT9a493PvrOU z01xpfsCgXl6XK_Ven$K}(7yiyFYy|0@D3mF37_#5JNSklwEh#n@EiMBAL|_82peF> z1HH?U{4=z6mPMG(#z|dfX_g^2dv+9r;}E*6%&Nq7il%UT`?h=hS3OSeuK(k_W$*Xw z+y8c=k9#=Z7q-JB;}-gG7?KgT!mbit9Sgf^c-13A%Mm0c<0{b{1?Rttl44(y>`66d z({CX}p6DW^6p^OegbNfY93_l71PTY8SH-!~MC#DbD;YxaEvj%;oeUacP$p|$^w+i_ zrDrI3Q&r*Fb&4Ali{vOVattLda8zJ|qbdt6Btd$XJe_AF9QdX*jhvpQWKyxE3Bh@3 z9MUC{;$HX%g-CS;jnQ$Yx?;X7cz;n$T|0tWuRt1w6z7*lJ(4(tNMvXz8XX>%<>h75 zTwBZK@_EZD6pBULcAQdaecg38HaxFfu2ibkT5WT)UfQ?{& literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/screen-w b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/screen-w new file mode 100644 index 0000000000000000000000000000000000000000..965601433d1e6a82be5936d800c9f6198b3aa8c9 GIT binary patch literal 1334 zcmc&zJ8Tm{5Pb`X1ds?FpOfH(bP|zcb3ey1QN9FZNQ@zgki|8z9LGNU&UXBdKcS&P z6f{&+NE8%^hJu0uQGkR54OEDNDisAZ6g23VUE2k63K|s4^WK}cv$L}+-6?hfBRB?| zeP`ulDV56m>+PGXvZku%=dP_>k>f^S+>~o}sZvciawS!A?L3LPUCGFrq07mFQwEs$ zb0WcT2g5i4Z6n#VnULj1I+pAkRrY0rCsmw1ggc!v-8gwObj9el$NTK|b( z_>FyRh;=V;gpIJ{J-y47yfd_Rmid^;rbu08F%~CI4D84X$0aPXGOH3dC|bfD?Asae zUkx~eyZ(>!mc8Gzv;XZzANO#+FKmZN)-4R-FeFQ{m7=DsPbx)SSuc@cqzNLDb(Lt5 zg7aTR5wR~q_KY5M=(7+aLv#^Rl*lk0!s`@K93>381R4jESB1DTMC#JVELlSGExK@Z zlMEVSR3&Rk^f$I4#pWq^Q(fcP4T@!o6>_v7IhGa@I3Y01QCEc)k|4G~p2@Ru4t!IL zMvl!*)MpEM45m2v3?}{*;Cofh)78{s5B@@1g(z literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/sun b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/s/sun new file mode 100644 index 0000000000000000000000000000000000000000..47c0d66faa75dd398d28cce7e313fbd4d1edcb8c GIT binary patch literal 1019 zcmb_aJx>Bb5S>-ySB%EkK_O^1YD~nvLq0-?qL_$6z!)oR3{aqQhujfALPBR}XJ=<& zXJ=tyYinz3Vf-67J9`j7sPvLI@6F8H$xL!C7J?}lge8_{R@JB>gbZ5kplWzh#azX- zt}MGyvOEbRx8k`lE2oxyY!^+#lQRv=JSzY&pidEl3^W>Z2!H{Mjm8iR!#Jr)m?id7 zoX5C;SOy>E(%bpz5OO+Ehhx8-+mOIo%BiQ3_gkJrID#CUz&Tt(9d6(j?%?JBn-Ay*?Iw;_>4 zVc`+(>?&X9~%;(U;zghWj{M3mA}*uqe&&PQ82aT3Q#TDKA_ zYXxFJhyfu6gcukY7#J8B7#J8BkYE4_2_}S?kj(LWPTGk60iJyBJ@?%6uHLgf&Q8;D z8lw>Nm}9H4m@DEL&2;thN<uQBM!OK^PcWe zp9TCmy`Y!$ieA$jdQ0!rzXbUk{h(g~AI#h@{|P*Y8Qz(90vKHpp=1&B ztiWd39NPiEGxXhM_t*pWkUbX4lcD~JeHHxsP}!aPb02ND`~R`uY>bYPQsS%JQn{Yt zR-EfC2#G2}Q7K)DW>c{o_*^ub@bgd@*;0fpCngo~=P9L`Xg2PIOos; zq+kl|EM(xCjO%a{DzF6)(R&0AvWsYdFS8vOz=>3G{7l;C@Dg65dIRsI{~kWT$D|^T zKcV`J_=fnNM1P?DndmtF1;1g6%#e%Z5}70OBtvp!f#@WT3kaL6kQ->lSx@ZP`+vTJ zeVXJ1`3ZSSUXWL^@0T;We?5)QrRG!r{%R&Q4HrPE(gqDQTC-@tXf4D*S*f!1tZk@8 zbZ%vBUD(sWU*+Yjt;w=g@g8EC86M1xMIFr=Vg<2@sDP4Fvo;g$3_lUtL~v1VPCU~` zk0a$)vo;rROfuX1y#*rJj4*Uv@+y--7w#+JE5D8oX1@^%FF)@%WliD^btxN zc0&xrmeAYSLfl2%6TM84*9wwFw#rn=nv6&(sDxM)!Vr{PvWVB$JtQv35Mcziq(_rb9x Ji%s(p`~h@Wg6jYP literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/v/vt52 b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/v/vt52 new file mode 100644 index 0000000000000000000000000000000000000000..d55932876a44f3f076fc94bdfe1a6903af666286 GIT binary patch literal 461 zcmb1QAlA5dlVlV_Sa4<+P{Qu9uzyu`!|7T&~WZ(g__!%@9 zw1F%=FwYQ3nt)j#Rsa8+Be5YOFwzRA3`~VBk_vkyHcTF!c7m#Lh0-1b^mr4HM>ikD z_XCCmL_8RW?obAH1}+9^4{0w3X>SG)8L3)esH(1@uBxq?tXg0MV=_oP0hKXGyD&&Q zGe|o!NV_pey90w6Bn%Vd0vY8A4C{o1#Kg3;^z^K(?ChMJ+}ymp{QQD~!os4W;^LB$ Z($ccB^74v`%F3#$>gt-B+SQ4gt>wvPw%G-b*Jl{^`{eR8*C_am?;=A}M zev1KZNIR$<(RQx5JN0qxw02&zcI7lNZ66JhZih?Zsu9k`!&Mp1c@WG3U{bf`6!J7e z<-c5$JaG~qgKkeC#u2lK6b%Cnm-MJ^C#`4^m8BpGsRx#ek5RW(EvMMz=rI(Q(^q?w zJyI@SshkpF~O6WmU zbu~qUG(VrsE-n@drP9*U^0MQ&Zn<2kRI4j1o>!~Y>y5_hYO~pDwcBfJ>+79Px4VIp zk4CVcrS73R(PL7z$d;^1ZinQXN^Xbbc9?88rE;3=H`$LTj+Y{bZrWpI0G@+fKvt2W EKW-D*_5c6? literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/x/xterm-xfree86 b/obsolete-buildroot/sources/target_skeleton/usr/share/terminfo/x/xterm-xfree86 new file mode 100644 index 0000000000000000000000000000000000000000..eeac9d8d35fdaf374dd11590cfaabc6f45a69c64 GIT binary patch literal 1840 zcmcIkONbn05U%PGlc;3zAhMQFjU;xC>l}>p9&jYMLSE;$ z`5i>P&mZ#_&|fAQ-|!ZH2Y!QpRL@QRgKzU4zRQ1c*@&W(kocJ~P8+Wq=Z!bjQycr= zGd@)QiQ?yDe-vFauEW~=hi6plVfyPG8$TF78^0RA8-E(Nj625PJIa69ZnoF& z?XWJVo=82JnoLclMm6@Qf-xWY{vUlkdCz8QD`i$M&@Ot6%&OJ2y0%p>SzX7f_uz0B z0A;i4oPa(F5uHT6x=rJRveqcW?K{~3pNNu0sFxrwZkwk-XJ{`l+XC1EzMb(3i?Pm2 zjweu%rTiE?VYID19UZpZKQ?M3ql z7WEkNHYGD7f<45Zqa!jsB2rv~rJYKoZWH1OWC0hU|8>LyoXO1UWaec`^16)WOObBQ zTC>8EZI#4!K)sk^$gw9s`uc{n&)0k4 z=P|bf$IOEn)Os0i>2F02AXAFF?a275j&|PBQ8_vQM@Qx8s9X(q9f@=`-qm1<`LeFYQ`&M1Ga*5@sWhYinEjPC6Xc($^ S|49`&zpHm3t|^~wi|zx05Hhj= literal 0 HcmV?d00001 diff --git a/obsolete-buildroot/sources/target_skeleton/usr/share/udhcpc/default.script b/obsolete-buildroot/sources/target_skeleton/usr/share/udhcpc/default.script new file mode 100755 index 0000000000..a52a7f8122 --- /dev/null +++ b/obsolete-buildroot/sources/target_skeleton/usr/share/udhcpc/default.script @@ -0,0 +1,39 @@ +#!/bin/sh + +# udhcpc script edited by Tim Riker + +[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 + +RESOLV_CONF="/etc/resolv.conf" +[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" +[ -n "$subnet" ] && NETMASK="netmask $subnet" + +case "$1" in + deconfig) + /sbin/ifconfig $interface 0.0.0.0 + ;; + + renew|bound) + /sbin/ifconfig $interface $ip $BROADCAST $NETMASK + + if [ -n "$router" ] ; then + echo "deleting routers" + while route del default gw 0.0.0.0 dev $interface ; do + : + done + + for i in $router ; do + route add default gw $i dev $interface + done + fi + + echo -n > $RESOLV_CONF + [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF + for i in $dns ; do + echo adding dns $i + echo nameserver $i >> $RESOLV_CONF + done + ;; +esac + +exit 0 diff --git a/obsolete-buildroot/sources/tinyx-011010.patch b/obsolete-buildroot/sources/tinyx-011010.patch new file mode 100644 index 0000000000..3040b3dd40 --- /dev/null +++ b/obsolete-buildroot/sources/tinyx-011010.patch @@ -0,0 +1,173 @@ +diff -Nur --exclude=CVS xc-011010.src/include/extensions/lbxstr.h xc-011010/include/extensions/lbxstr.h +--- xc-011010.src/include/extensions/lbxstr.h Tue Jul 31 20:44:35 2001 ++++ xc-011010/include/extensions/lbxstr.h Sun Apr 21 12:35:05 2002 +@@ -25,7 +25,7 @@ + #ifndef _LBXSTR_H_ + #define _LBXSTR_H_ + +-#include ++#include "XLbx.h" + + #define LBXNAME "LBX" + +diff -Nur --exclude=CVS xc-011010.src/programs/Xserver/hw/kdrive/fbdev/fbdev.h xc-011010/programs/Xserver/hw/kdrive/fbdev/fbdev.h +--- xc-011010.src/programs/Xserver/hw/kdrive/fbdev/fbdev.h Sun Jun 3 17:52:45 2001 ++++ xc-011010/programs/Xserver/hw/kdrive/fbdev/fbdev.h Sun Apr 21 12:36:25 2002 +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include "kdrive.h" + #include "layer.h" + +diff -Nur xc-011010.src2/lib/X11/Xlib.h xc-011010/lib/X11/Xlib.h +--- xc-011010.src/programs/Xserver/hw/kdrive/linux/ts.c Tue Jul 10 22:58:19 2001 ++++ xc-011010/programs/Xserver/hw/kdrive/linux/ts.c Tue Apr 23 20:16:23 2002 +@@ -33,65 +33,48 @@ + #include "kdrive.h" + #include "Xpoll.h" + #include +-#include /* touch screen events */ ++ ++typedef struct { ++ unsigned short pressure; ++ unsigned short x; ++ unsigned short y; ++ unsigned short pad; ++ struct timeval stamp; ++} TS_EVENT; + + static long lastx = 0, lasty = 0; + int TsScreen; + extern int TsFbdev; + +-void +-TsRead (int tsPort, void *closure) +-{ +- TS_EVENT event; +- long buf[3]; +- int n; +- long pressure; +- long x, y; +- unsigned long flags; +- unsigned long buttons; +- +- n = Ps2ReadBytes (tsPort, (char *) &event, +- sizeof (event), sizeof (event)); +- if (n == sizeof (event)) +- { +- if (event.pressure) +- { +- /* +- * HACK ATTACK. (static global variables used !) +- * Here we test for the touch screen driver actually being on the +- * touch screen, if it is we send absolute coordinates. If not, +- * then we send delta's so that we can track the entire vga screen. +- */ +- if (TsScreen == TsFbdev) { +- flags = KD_BUTTON_1; +- x = event.x; +- y = event.y; +- } else { +- flags = /* KD_BUTTON_1 |*/ KD_MOUSE_DELTA; +- if ((lastx == 0) || (lasty == 0)) { +- x = 0; +- y = 0; +- } else { +- x = event.x - lastx; +- y = event.y - lasty; +- } +- lastx = event.x; +- lasty = event.y; +- } +- } else { +- flags = KD_MOUSE_DELTA; +- x = 0; +- y = 0; +- lastx = 0; +- lasty = 0; +- } +- KdEnqueueMouseEvent (flags, x, y); ++void TsRead (int tsPort, void *closure) { ++ TS_EVENT event; ++ long buf[3]; ++ int n; ++ long pressure; ++ long x, y; ++ unsigned long flags; ++ unsigned long buttons; ++ ++ n = Ps2ReadBytes(tsPort, (char *) &event, sizeof (event), sizeof (event)); ++ if (n >= sizeof (event)) { ++ if (event.pressure >= 100) { ++ flags = KD_BUTTON_1; ++ x = (960 - event.x) * 640 / (920); ++ y = (960 - event.y) * 480 / (920); ++ //ErrorF("flags %d x %d y %dn",flags,event.x,event.y); ++ } ++ else { ++ flags = KD_MOUSE_DELTA; ++ x = lastx; ++ y = lasty; + } ++ KdEnqueueMouseEvent(flags, x, y); ++ } + } + + char *TsNames[] = { +- "/dev/ts", +- "/dev/h3600_ts" /* temporary name; note this code can try ++ "/dev/ucb1x00-ts", ++ "/dev/ts" /* temporary name; note this code can try + to open more than one device */ + }; + +@@ -99,9 +82,7 @@ + + int TsInputType; + +-int +-TsInit (void) +-{ ++int TsInit (void) { + int i; + int TsPort; + +diff -Nur xc-011010.src/startx xc-011010/startx +--- ../../buildroot-tux.Apr25-1/build/xc-011010.src/startx Thu Apr 25 05:20:35 2002 ++++ xc-011010/startx Sun Apr 28 05:35:35 2002 +@@ -0,0 +1,11 @@ ++#!/bin/sh ++killall Xfbdev ++sleep 1 ++export DISPLAY=":0" ++/usr/X11R6/bin/Xfbdev -ac & ++sleep 4 ++/usr/X11R6/bin/matchbox & ++sleep 1 ++/usr/X11R6/bin/minisys & ++/usr/X11R6/bin/minitime & ++/usr/X11R6/bin/rxvt & +diff -Nur xc-011010.src/lib/Xft/xftgram.y xc-011010/lib/Xft/xftgram.y +--- ../../buildroot-tux.Apr25-1/build/xc-011010/lib/Xft/xftgram.y Thu Apr 25 05:20:35 2002 ++++ xc-011010/lib/Xft/xftgram.y Sun Apr 28 05:35:35 2002 +@@ -165,6 +165,7 @@ + matrix.yx = $4; + matrix.__REALLY_YY__ = $5; + } ++ ; + number : INTEGER + { $$ = (double) $1; } + | DOUBLE +diff -Nur xc-011010.src/programs/twm/gram.y xc-011010/programs/twm/gram.y +--- ../../buildroot-tux.Apr25-1/build/xc-011010/programs/twm/gram.y Thu Apr 25 05:20:35 2002 ++++ xc-011010/programs/twm/gram.y Sun Apr 28 05:35:35 2002 +@@ -650,6 +650,7 @@ + RemoveDQuote(ptr); + $$ = ptr; + } ++ ; + number : NUMBER { $$ = $1; } + ; + diff --git a/obsolete-buildroot/sources/uClibc-ldso-0.9.24.patch b/obsolete-buildroot/sources/uClibc-ldso-0.9.24.patch new file mode 100644 index 0000000000..ee65aa1935 --- /dev/null +++ b/obsolete-buildroot/sources/uClibc-ldso-0.9.24.patch @@ -0,0 +1,11861 @@ +diff -urN uClibc/ldso-0.9.24/COPYRIGHT uClibc.ldso.24/ldso-0.9.24/COPYRIGHT +--- uClibc/ldso-0.9.24/COPYRIGHT 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/COPYRIGHT 2001-04-23 12:43:53.000000000 -0500 +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, David Engel, ++ * Hongjiu Lu and Mitch D'Souza ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++/* Notice of general intent: ++ * ++ * The linux operating system generally contains large amounts of code ++ * that fall under the GNU General Public License, or GPL for short. ++ * This file contains source code that by it's very nature would always ++ * be linked with an application program, and because of this a GPL ++ * type of copyright on this file would place restrictions upon the ++ * distribution of binary-only commercial software. Since the goal of ++ * the Linux project as a whole is not to discourage the development and ++ * distribution of commercial software for Linux, this file has been ++ * placed under a more relaxed BSD-style of copyright. ++ * ++ * It is the general understanding of the above contributors that a ++ * program executable linked to a library containing code that falls ++ * under the GPL or GLPL style of license is not subject to the terms of ++ * the GPL or GLPL license if the program executable(s) that are supplied ++ * are linked to a shared library form of the GPL or GLPL library, and as ++ * long as the form of the shared library is such that it is possible for ++ * the end user to modify and rebuild the library and use it in ++ * conjunction with the program executable. ++ */ +diff -urN uClibc/ldso-0.9.24/Makefile uClibc.ldso.24/ldso-0.9.24/Makefile +--- uClibc/ldso-0.9.24/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/Makefile 2003-11-06 16:38:45.000000000 -0600 +@@ -0,0 +1,52 @@ ++# Makefile for uClibc ++# ++# Copyright (C) 2000,2001 Erik Andersen ++# ++# This program is free software; you can redistribute it and/or modify it under ++# the terms of the GNU Library 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 Library General Public License for more ++# details. ++# ++# You should have received a copy of the GNU Library 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 ++# ++# Derived in part from the Linux-8086 C library, the GNU C Library, and several ++# other sundry sources. Files within this library are copyright by their ++# respective copyright holders. ++ ++TOPDIR=../ ++include $(TOPDIR)Rules.mak ++ ++ALL_SUBDIRS = ldso libdl ++ ++ ++all: headers ++ifeq ($(strip $(BUILD_UCLIBC_LDSO)),y) ++ $(MAKE) -C ldso; ++else ++ echo "Not building ld-uClibc" ++endif ++ ++shared: ++ifeq ($(strip $(BUILD_UCLIBC_LDSO)),y) ++ $(MAKE) -C libdl; ++else ++ echo "Not building libdl" ++endif ++ ++headers: ++ $(LN) -fs $(TOPDIR)../include/elf.h include/ ++ $(LN) -fs ../ldso/$(TARGET_ARCH)/boot1_arch.h include/ ++ $(LN) -fs ../ldso/$(TARGET_ARCH)/ld_syscalls.h include/ ++ $(LN) -fs ../ldso/$(TARGET_ARCH)/ld_sysdep.h include/ ++ ++clean: ++ set -e ; for d in $(ALL_SUBDIRS) ; do $(MAKE) -C $$d $@ ; done ++ -find . -name '*~' | xargs $(RM) ++ $(RM) include/elf.h include/boot1_arch.h include/ld_syscalls.h include/ld_sysdep.h +diff -urN uClibc/ldso-0.9.24/README uClibc.ldso.24/ldso-0.9.24/README +--- uClibc/ldso-0.9.24/README 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/README 2001-05-31 16:23:20.000000000 -0500 +@@ -0,0 +1,841 @@ ++ ++Apr 20, 2001 -- Manuel Novoa III ++ ++Inital port for uClibc from debian ld.so_1.9.11-9.tar.gz. ++ ++Removed a.out support. ++ ++****************** original ld.so.lsm file ************************** ++Begin3 ++Title: Linux shared, dynamic linker and utilities. ++Version: 1.9.11 ++Entered-date: 01MAY99 ++Description: This package contains ld.so, ld-linux.so, ldconfig, ++ ldd and libdl. ++Keywords: dynamic linker, shared library, ld.so, ld-linux.so, ++ ldconfig, ldd, libdl ++Author: david@ods.com (David Engel) ++Maintained-by: david@ods.com (David Engel) ++Primary-site: tsx-11.mit.edu /pub/linux/packages/GCC ++ ld.so-1.9.11.tar.gz ++Alternate-site: sunsite.unc.edu /pub/Linux/GCC ++ ld.so-1.9.11.tar.gz ++Platform: Linux 2.0.0 or later. ++Copying-policy: Copyrighted but freely distributable. ++End ++********************************************************************* ++ Original README starts here ++********************************************************************* ++ ++This package contains my ELF dynamic linkers (ld-linux.so.1), dynamic ++linker library (libdl.so.1) and utilities (ldconfig and ldd) for Linux. ++ ++You need Linux kernel 2.0.0 or later with ELF support compiled in ++(i.e. not loaded as a module) to use this package. ++ ++The dynamic linker is used to bootstrap programs and load shared ++libraries at startup. The dynamic linker library is used to ++dynamically load shared libraries after a program is running. ++Ldconfig is used to automatically update the symbolic links to shared ++libraries and build the cache file used by the dynamic linker. Ldd is ++used to list the shared libraries used by a program. ++ ++Please see the included manual pages for further details. ++ ++To install, simply run "sh instldso.sh" as root. Ready-to-go versions ++of all end-products are provided so nothing should need to be compiled ++or linked. If you are still using libc5 as your primary development ++library, you should use the "--devfiles" option when running ++instldso.sh to install the file needed to compile with libdl. ++ ++ELF versions of gcc, binutils and libc are now required to compile ++everything, including the old, unsupported, a.out dynamic linker. ++Finally, an optimization level of O2 or higher must be used to compile ++ld-linux.so and libdl.so due the use of inline functions. ++ ++Notable contributors to this package include Eric Youngdale, Peter ++MacDonald, Hongjiu Lu, Linus Torvalds, Lars Wirzenius, Mitch D'Souza, ++Rik Faith, Andreas Schwab and Adam Richter (not necessarily in that ++order). ++ ++###################### IMPORTANT NOTICES ############################# ++ ++A.OUT SUPPORT: ++ ++As of ld.so-1.9.0, the old, a.out dynamic loader is no longer ++officially supported. The code is still included and built, but I ++make no promises that it will work. I will accept patches for it, ++but they will not be tested by me. ++ ++GLIBC (AKA LIBC6) SUPPORT: ++ ++As of ld.so-1.9.0, the main focus of this package is to ease the ++transition to libc6. No significant, new features are expected to be ++added. If you need new features, switch to libc6. ++ ++Except for libpthread.so, the sonames of the core libraries provided ++with libc6 have been chosen so they do not conflict with those ++provided by libc5 and ld.so. However, the current plan is not use ++new, nonconflicting sonames for other libraries such as ncurses and ++X11. This presents two problems. First, libraries using the same ++soname for both libc5 and libc6 can not be placed in the same ++directory. Second, the dynamic linkers need to make sure not to load ++a library for the wrong version of libc. ++ ++The first problem is easy. Just move the old, libc5-based libraries ++to new directories (e.g. /lib/libc5-compat, /usr/lib/libc5-compat, ++etc.) and add those directories to /etc/ld.so.conf. Then install the ++new, libc6-based versions in the standard places. ++ ++The second problem is more difficult. Ideally, the dynamic linkers ++would be changed to perform a complete dependency analysis on every ++library to be loaded to make sure the wrong versions aren't used. ++This approach doesn't seem worth the added complexity, especially ++since we now have symbol versioning for ELF libraries. Instead a ++simpler approach will be used, at least initially. ++ ++Ldconfig has been modified to perform a (currently simple) dependency ++analysis on libraries and to store an indication in /etc/ld.so.cache ++of whether a library is for libc5, libc6 or an unknown libc. The ++dynamic linkers then only need to make a simple check at run-time to ++make sure they don't load the wrong version of a library. ++ ++The dynamic linker for libc5 provided in this package, has already ++been modified to use the new information in /etc/ld.so.cache. For ++glibc versions 2.0.1 and earlier, the dynamic linker for libc6 needs ++the patch contained in glibc.patch. You should apply the patch and ++rebuild glibc before using the new ldconfig. ++ ++As stated above, the dependency analysis currently done by ldconfig is ++rather simple. Basically, it looks for the sonames used by the ++various versions of libc, libm and libdl. For any approach using a ++dependency analysis such as this to work, it is very important that ++shared libraries be built with complete dependency information. This ++can be done by using the appropriate -l options when running 'gcc ++-shared'. For example, when building libfoo.so which depends on libc ++and libbar, you should add -lbar and -lc gcc command line. ++ ++###################################################################### ++ ++Changes in version 1.9.11: ++ ++ Fixed a bug in ld-linux.so where a reference to an ++ undefined symbol could cause a segfault. ++ ++ Added a clarification for LD_PRELOAD to the ld.so manual ++ page and added a symlink for ld-linux.so (Bug#33123). ++ ++ Don't install ldd for Debian except for the m68k arch ++ because glibc 2.1 now includes it (Bug#35458). ++ ++Changes in version 1.9.10: ++ ++ Changed ldconfig to issue a warning and not overwrite a ++ regular file with a symlink (Bug#30859). ++ ++ Changed Debian packaging to conflict with and replace the ++ ldconfig package (Bug#29398). ++ ++Changes in version 1.9.9: ++ ++ Changed ld-linux.so and libdl.so to match glibc by not ++ allowing user preloads of system libraries into setu/gid ++ binaries unless the library itself is setuid. ++ ++ Fixed problems in ld-linux.so on the sparc architecture ++ (Juan Cespedes). ++ ++Changes in version 1.9.8: ++ ++ Changed ldconfig to allow the expected type for all ++ libraries in a directory to be optionally specified ++ (Mark Phillips). See the ldconfig man page. ++ ++ Changed ldconfig to use the same type names used in the ++ change above when the -p option is used. ++ ++Changes in version 1.9.7: ++ ++ Changed ldd for m68k to use /lib/ld.so.1 instead of ++ /lib/ld-linux.so.2. ++ ++ Added support for dladdr to libdl.so (Eduard Gode). ++ ++ Fixed a small memory leak in libdl.so (Richard Garnish). ++ ++ Fixed a bug in ldconfig when the -l option was used on a ++ filename without a '/' in it. ++ ++ Updated the man pages (Bug#6404, Bug#9721, Bug#10652, ++ Bug#13494 and Bug#14127). They could still use some work. ++ ++ No longer install the info page since it's way out of date. ++ ++ Fixed minor Debian packaging problems (Bug#13160, ++ Bug#15577 and Bug#19345). ++ ++Changes in version 1.9.6: ++ ++ Changed ldd to not use the glibc dynamic linker when run ++ on a libc5-based shared library. ++ ++ Added a -q option to ldconfig which causes warnings not ++ to be printed (Bob Tinsley). ++ ++ Dropped support for the Debian libdl1-dev package. ++ ++ Changed ld-linux.so to be compilable with gcc 2.8.0 (Sven ++ Verdoolaege) ++ ++Changes in version 1.9.5: ++ ++ Fixed a bug in ldd where ld-linux.so.2 was not called ++ correctly when run on shared libraries. ++ ++ Fixed a problem in the previous version where some ++ Makefiles were not architecture independent. ++ ++Changes in version 1.9.4: ++ ++ Fixed a bug in ld.so introduced in the previous version ++ which broke preloads. ++ ++ Turned a.out support back on by default, at least for the ++ time being. There are no promises to keep it. ++ ++Changes in version 1.9.3: ++ ++ Fixed buffer overflow bugs in ld-linux.so and ld.so. ++ ++ Changed the README file a little to clarify a couple of ++ things. ++ ++ Changed ldconfig to chroot to the specified directory when ++ the new -r option is used (Bob Tinsley). ++ ++Changes in version 1.9.2: ++ ++ Removed /usr/local/lib from the default /etc/ld.so.conf ++ for Debian (Bug#8181). ++ ++ Changed ldconfig to be 64-bit clean (H.J. Lu). ++ ++Changes in version 1.9.1: ++ ++ Changed ldconfig to try to determine which libc a ++ library is for even if it doesn't have an soname. ++ ++ Fixed a bug in ldconfig where an older library using ++ the glibc naming convention would be used instead of ++ a newer library. ++ ++ Changed to ld-linux.so and libdl.so to not require the ++ libc5 headers in order to compile. ++ ++ Changed ldconfig and ldd to be compilable with either ++ libc5 or libc6. ++ ++Changes in version 1.9.0: ++ ++ Changed to not build the old, a.out dynamic loader by ++ default. ++ ++ Changed instldso.sh to require the --force option to ++ make sure users read the README file. ++ ++ Changed instldso.sh to not install the libdl.so ++ development files unless the --devfiles option is used. ++ ++ Changed instldso.sh to not strip binaries and libraries ++ if the --no-strip option is used. ++ ++ Changed the Debian packaging to put the development files ++ which conflict with glibc in a new libdl1-dev package. ++ ++ Changed ldd to use the glibc dynamic linker, if it is ++ available, when run on a shared library. ++ ++ Changed ld-linux.so to print the load addresses of ++ libraries, ala glibc, when run by ldd. ++ ++ Changed ld-linux.so to allow the libraries listed in ++ LD_PRELOAD to be separated by white space in addition to ++ colons. ++ ++ Changed ld-linux.so to load the libraries listed in ++ LD_PRELOAD for setu/gid programs as long as they can be ++ loaded securely. ++ ++ Changed ldconfig to update the symlinks for the dynamic ++ linkers. ++ ++ Changed ldconfig to try to determine if an ELF library is ++ intended for libc5 or libc6 and save the infomation in the ++ cache. The mechanism used is rather simplistic and may ++ need to be enhanced. ++ ++ Changed ldconfig to print the type of ELF library when ++ printing the cache. ++ ++ Changed ld-linux.so to only load ELF shared libraries for ++ use with libc5 or an unknown libc. ++ ++Changes in version 1.8.10: ++ ++ Fixed a bug in ldconfig where a symlink could be used ++ instead of a regular file. ++ ++ Fixed a Debian packaging problem for the sparc ++ architecture. ++ ++Changes in version 1.8.9: ++ ++ Changed ldconfig to only cache the symlinks it creates. ++ This make the behavior of the dynamic linkers consistent ++ with how they would behave if a cache was not used. ++ ++ Changed ldconfig to cache the symlinks that it finds but ++ use the name of the symlink as the soname instead of the ++ actual soname. ++ ++Changes in version 1.8.8: ++ ++ Minor documentation updates to reflect recent changes. ++ ++ Changed ld.so and ld-linux.so to perform more complete ++ validation on ld.so.cache before using it. ++ ++ Changed ldconfig to accept libraries with inconsistent ++ sonames since glibc is going to use them. A warning is ++ still printed in debug mode. ++ ++ Changed the install script to not strip _dl_debug_state ++ from ld-linux.so since gdb needs it. ++ ++ More sparc fixes (Derrick Brashear). ++ ++ Changed ldconfig to not issue a warning when a linker ++ script disguised as a shared library is found. ++ ++ Fixed a bug in ld-linux.so where some registers were ++ not preserved on the first call to a function causing ++ problems for non-C-like languages (Tim Renouf). ++ ++ Fixed a bug in ld-linux.so where global variables were ++ not always mapped correctly across dynamically loaded ++ libraries (Mikihiko Nakao). ++ ++ Converted to new Debian source packaging format (Shaya ++ Potter). ++ ++Changes in version 1.8.6/7: ++ ++ Never released as some unofficial patches used these ++ version numbers. ++ ++Changes in version 1.8.5: ++ ++ Fixed a bug in ld.so introduced in the previous changes. ++ ++Changes in version 1.8.4: ++ ++ Changed ldconfig to completely ignore symbolic links. ++ ++ Changed ldconfig to issue the warning concerning an ++ inconsistent soname in non-verbose mode. ++ ++ Changed ld-linux.so back to not keep ld.so.cache mapped ++ at all times. ++ ++ Changed Debian packaging to compress man pages, strip all ++ binaries (Bug#5125) and include a shlibs file. ++ ++Changes in version 1.8.3: ++ ++ Changed ld-linux.so to process LD_PRELOAD before ++ /etc/ld.so.preload. ++ ++ Fixed a Debian packaging problem where libdl might not ++ be available if other packages were upgraded at the same ++ time (Debian Bug#4728). ++ ++ Changed ldd to always exit with status 1 if any errors ++ occur (Debian Bug#4188). ++ ++ Fixed some minor problems in instldso.sh (Mike Castle and ++ Wolfgang Franke). ++ ++ Changed ldconfig to issue a warning in verbose mode when ++ skipping a library because the soname doesn't match. ++ ++ More sparc fixes (Miguel de Icaza). ++ ++ Don't link with -N when building ld.so (Alan Modra). ++ ++ Changed ld-linux.so to better support position-dependant ++ libraries (NIIBE Yutaka). ++ ++Changes in version 1.8.2: ++ ++ Added a texinfo file for ld.so and libdl (Michael ++ Deutschmann). ++ ++ Minor sparc and installation changes (Elliot Lee). ++ ++ Added multiple architecture support for Debian (Leland ++ Lucius). ++ ++ Changed libdl to better support RTLD_NEXT (Eric ++ Youngdale). Note: the exact meaning of ETLD_NEXT is ++ still not clear in all cases. ++ ++ Removed some libc dependencies from libdl. Still need ++ to remove malloc and free. ++ ++Changes in version 1.8.1: ++ ++ Changed ld.so to be compiled as ELF. This also means ++ that ELF support is now required. A.out support is ++ still optional. ++ ++ Changed ld-linux.so and libdl.so to use the rpath in the ++ executable instead of in the invoking shared library. ++ ++ More m68k fixes (Andreas Schwab). ++ ++ Various sparc fixes (Miguel de Icaza). ++ ++ Changed ldcnnfig to ignore libraries ending in '~'. ++ ++ Changed ldconfig to allow alternative conf and cache ++ files to be specified on the command-line. ++ ++ Changed libdl.so to work when dlsym is passed a NULL ++ handle pointer. ++ ++Changes in version 1.8.0: ++ ++ Changed ld-linux.so to be more liberal when checking to ++ see if a library is already loaded. This should avoid ++ the duplicate loading problem for programs linkeed with ++ the -rpath option. ++ ++ Various m68k fixes (Andreas Schwab). ++ ++ Changed ld.so to only use LD_AOUT_LIBRARY_PATH and ++ LD_AOUT_PRELOAD and ld-linux.so to only use ++ LD_LIBRARY_PATH and LD_PRELOAD. LD_ELF_LIBRARY_PATH ++ and LD_ELF_PRELOAD are no longer supported. ++ ++ Changed ld-linux.so to allow debugging of shared and ++ dynamically loaded libraries (H.J. Lu, Andreas Schwab). ++ ++ Changed ld-linux.so to preload ELF shared libraries ++ listed in /etc/ld.so.preload. This allows secure ++ preloads, even for setuid/setgid programs. ++ ++ Changed ld-linux.so to keep ld.so.cache mapped at all ++ times. ++ ++ Changed ldconfig to allow #-style comments in ld.so.conf. ++ ++ Removed various compiler warnings (Richard Sladkey and ++ David Engel). ++ ++ Changed ldd to work on ELF shared libraries. This may ++ need a little more work. ++ ++Changes in version 1.7.14: ++ ++ Changed ldconfig to recognize ELF shared libraries ++ generated by post-2.6 versions of ld (Andreas Schwab). ++ ++ Changed ldconfig to not remove stale links that do not ++ have a version number since they may be needed by ld. ++ ++Changes in version 1.7.13: ++ ++ Fixed a problem in ld-linux.so where a program linked ++ with a shared library that was not used could result in ++ a segmentation fault (H.J. Lu). ++ ++Changes in version 1.7.12: ++ ++ Fixed a problem in libdl.so where the wrong library ++ could be marked as global when RTLD_GLOBAL was used ++ (Lars Heete). ++ ++ Installed dlfcn.h with libdl.so instead of requiring ++ it to be supplied with libc. ++ ++ Removed support for libldso.a since it was nearly ++ impossible to use anyway. ++ ++ Changed ldd to detect when the program being checked ++ exited abnormally. ++ ++Changes in version 1.7.11: ++ ++ Changed ld.so and ld-linux.so to delete all variations ++ of LD_PRELOAD and LD_LIBRARY_PATH for set[ug]id programs, ++ This makes it harder for broken set[ug]id programs to be ++ compromised. ++ ++ Fixed a problem in libdl.so where dlsym would not accept ++ the handle returned from dlopen(0, *). ++ ++Changes in version 1.7.10: ++ ++ Changed ld-linux.so and libdl.so to support RTLD_GLOBAL ++ (Eric Youngdale). ++ ++Changes in version 1.7.9: ++ ++ Fixed a problem in ld-linux.so in detecting when the ++ new user/group information is provided by the kernel. ++ ++ Fixed a problem in ld-linux.so where a buffer could be ++ overflowed if a large number of libraries were loaded ++ (Thomas Moore). ++ ++Changes in version 1.7.8: ++ ++ Changed the Makefiles and install scripts to support ++ a.out- and ELF-only configurations. ++ ++ Changed ld-linux.so to use the user/group information ++ provided by linux 1.3.23+ instead of making syscalls ++ to get it. ++ ++ Changed libdl.so to support RTLD_NEXT (Glenn Fowler). ++ ++ Changed libdl.so to only execute the fini sections ++ instead of completely closing libraries at exit (Glenn ++ Fowler). ++ ++ Changed ld.so and ld-linux.so to print the required ++ cache version when a mismatch is detected. ++ ++ Changed ld-linux.so to not require on /dev/zero (Ralph ++ Loader). ++ ++ Minor m68k cleanups (Andreas Schwab). ++ ++Changes in version 1.7.7: ++ ++ Fixed problems compiling with recent 1.3.x kernels. ++ ++ Changed ld-linux.so to not use MAP_DENYWRITE until the ++ permission issue regarding it is resolved. ++ ++Changes in version 1.7.6: ++ ++ Fixed a bug in ld-linux.so dealing with a zero-length ++ LD_{ELF_}PRELOAD. ++ ++ Changed ld.so and ld-linux.so to truncate all variations ++ of LD_PRELOAD and LD_LIBRARY_PATH for set[ug]id programs. ++ ++Changes in version 1.7.5: ++ ++ Changed ldconfig to recognize libraries without any ++ version number (eg. libXYZ.so). ++ ++ Changed ldconfig to not generate a corrupt cache when ++ the disk is full or other write errors occur. ++ ++ Changed ld-linux.so to map files with MAP_DENYWRITE to ++ keep them from being changed while the file is in use ++ (Rick Sladkey). ++ ++ Changed libdl to not overwrite the scope pointer of a ++ library if it was already loaded (H.J. Lu). ++ ++ Changed ld-linux.so so gdb can be used on constructors ++ (Eric Youngdale). ++ ++ Changed ldconfig to ignore ELF libraries where the soname ++ does not match the file name on the assumption that it is ++ a used at compile-time (eg. libcurses.so -> libncruses.so). ++ ++Changes in version 1.7.4: ++ ++ Changed ld-linux.so and libdl to use the appropriate ++ rpaths when searching for shared libraries (Eric ++ Youngdale). ++ ++ Changed ld-linux.so to search rpath before using the ++ cache. This more closely conforms to the IBCS standard. ++ ++Changes in version 1.7.3: ++ ++ Changed ld-linux.so to only print a library name the ++ first time it is loaded when run from ldd. ++ ++ Fixed a bug in ldconfig where an invalid cache could be ++ generated if a directory was specified multiple times in ++ ld.so.conf. ++ ++ Changed ld-linux.so so it will return the address of a ++ weak symbol when called from dlsym in libdl (Eric ++ Youngdale. ++ ++Changes in version 1.7.2: ++ ++ Changed libdl.so again to fix the undefined foobar ++ problem. ++ ++Changes in version 1.7.1: ++ ++ Changed libdl so it will compile at optimization level ++ O3 or higher. ++ ++ Changed ldconfig to always create the cache file with ++ mode 644. ++ ++ Changed ldconfig to not ingore valid symlinks. ++ ++ Changed ldconfig to use the library name as the soname ++ for ELF libraries that do not have an soname entry. ++ ++ Changed ld-linux.so to print the actual, requested library ++ name at the time it is loaded instead of trying to figure ++ it out after the fact. ++ ++Changes in version 1.7.0: ++ ++ Changed ldconfig to read the actual soname from the image ++ for ELF libraries and make it available to ld-linux.so. ++ The soname for DLL libraries is still determined by ++ truncating the minor numbers from the image file name. ++ ++ Changed ldconfig to no longer support the undocumented ++ sort options. ++ ++ Changed ld.so to require a valid cache to find libraries ++ in directories specified in ld.so.conf. /usr/lib and /lib ++ are still searched as a last resort. Ld-linux.so already ++ operated this way. ++ ++ Fixed a bug in libldso.a where the arguments to ++ shared_loader were not parsed correctly (Wolfram Gloger). ++ ++ Added support for RELA-style relocations under Linux/68k ++ (Andreas Schwab). ++ ++ Changed ld-linux.so to only map the cache once for all ++ libraries instead of individually for each library. ++ ++ Changed ld-linux.so continue searching the cache instead of ++ giving up when failing to load the first entry found. ++ ++ Changed ld-linux.so to produce output similar to ld.so when ++ run from ldd or when errors occur. ++ ++Changes in version 1.6.7: ++ ++ Changed the install scripts to make sure that ld.so and ++ ld-linux.so are always usable. ++ ++ Added support for Linux/Sparc (Eric Youngdale). ++ ++ Added support for Linux/68k (Andreas Schwab). ++ ++ Fixed various bugs in ld-linux.so dealing with closing ++ files, unmapping memory, dereferencing NULL pointers and ++ printing library names (David Engel, Eric Youngdale and ++ Andreas Schwab). ++ ++ Replaced the manual page for libdl with a freely ++ distributable one (Adam Richter). ++ ++ Fixed a bug in ld-linux.so where LD_LIBRARY_PATH and ++ LD_PRELOAD were not cleared for setuid/setgid programs. ++ ++ Fixed a bug in libdl where dlsym would not return the ++ correct address of a symbol if it was redefined in another ++ library (Oleg Kibirev). ++ ++ Changed ld-linux.so to use the following order to search ++ for libraries: LD_{ELF_}LIBRARY_PATH, ld.so.cache, rpath, ++ /usr/lib and /lib. ++ ++ Changed ld-linux.so to not needlessly allocate memory when ++ using ld.so.cache. ++ ++Changes in version 1.6.6: ++ ++ Changed ldconfig to not warn about removing stale links ++ unless the -v option is specified. ++ ++ Added manual pages for libdl (from FreeBSD/Sun) ++ ++ Fixed a bug in ld.so dealing with preloading of objects ++ generated by recent versions of ld (Mitch D'Souza). ++ ++ Fixed bugs in ldd where some errors were either not ++ detected or not printed. ++ ++ Fixed a bug in ld-linux.so where the trailing nul in a ++ library name was not being copied (Owen Taylor). ++ ++Changes in version 1.6.5: ++ ++ Changed ldconfig to remove stale symbolic links. ++ ++ Added debug hooks in ld-linux.so and libdl.so to be used ++ by a future version of gdb (Eric Youngdale). ++ ++Changes in version 1.6.4: ++ ++ Change ld-linux.so to print on stdout instead of stderr ++ when run from ldd. ++ ++ Added support for Debian GNU/Linux packaging. ++ ++Changes in version 1.6.3: ++ ++ Fixed a bug in libdl when closing a library (H.J. Lu). ++ ++Changes in version 1.6.2: ++ ++ Changed the error message printed by ldd when a file is ++ not a.out or ELF. It used to only list a.out formats. ++ ++ Changed ldconfig to no longer cache and set up links for ++ ld-linux.so. ++ ++ Changed ld-linux.so and libdl to not conflict with upcoming ++ changes in kernel header files. ++ ++ Changed ld-linux.so to not print preloaded libraries. ++ ++Changes in version 1.6.1: ++ ++ Updated the installation script. ++ ++ Changed ld.so and ld-linux.so to look for LD_AOUT_PRELOAD ++ and LD_ELF_PRELOAD, respectively, before LD_PRELOAD. ++ ++ Changed ld.so and ld-linux.so to use LD_AOUT_LIBRARY_PATH ++ and LD_ELF_LIBRARY_PATH, respectively, instead of ++ AOUT_LD_LIBRARY_PATH and ELF_LD_LIBRARY_PATH. ++ ++Changes in version 1.6.0: ++ ++ Changed ldconfig to process libraries which do not have ++ a minor version or patch level number. ++ ++ Incorporated ld-linux.so and libdl.so. ++ ++ Changed ld.so and ld-linux.so to not miss entries in the ++ cache when the fully qualified library is requested. ++ ++ Changed ldconfig to use stdout instead of stderr when ++ printing the cache. ++ ++Changes in version 1.5.3: ++ ++ LD_PRELOAD enhancements (Tristan Gigold). ++ ++ LD_PRELOAD patch for linux-68k (Andreas Schwab). ++ ++Changes in version 1.5.2: ++ ++ More ELF changes (Mitch D'Souza). ++ ++ Changed ldconfig to also update the link for ld-linux.so. ++ ++Changes in version 1.5.1: ++ ++ More ELF and LD_PRELOAD changes (Mitch D'Souza). ++ ++Changes in version 1.5.0: ++ ++ Chnaged all executables to QMAGIC (Mitch D'Souza and Rick ++ Sladkey). ++ ++ Added preliminary support for ELF to ldd and ldconfig (Eric ++ Youndale and H.J. Lu). ++ ++ Added support for LD_PRELOAD to ld.so (Mitch D'Souza). ++ ++ Removed the "advertising" clause from the copyright notices ++ in all source files. ++ ++Changes in version 1.4.4: ++ ++ Changed ldconfig to support QMAGIC libraries. ++ ++ Fixed a bug in ld.so where some of the error messages had ++ transposed arguments. ++ ++Changes in version 1.4.3: ++ ++ Fixed an obscure bug in ld.so where an index was not being ++ incremented when a library was not found using the cache. ++ ++Changes in version 1.4.2: ++ ++ Changed ldconfig to issue a warning and continue instead ++ of an error and exiting when a link can't be updated. ++ This is useful when some libraries are imported on read- ++ only file systems, such as an NFS mounted /usr. ++ ++ Changed ld.so to be more robust in searching for libraries. ++ A library is not considered found unless it can actually be ++ loaded. If a library is not found using the cache, the ++ standard directories are searched as in pre-cache versions. ++ ++Changes in version 1.4.1: ++ ++ Fixed minor Makefile problems. ++ ++ Added support for linux-68k. ++ ++ Fixed a bug in ld.so where libraries with absolute paths ++ were not handled correctly. ++ ++ Changed ld.so to ignore the directory in the names of ++ shared libraries by default. This allows older libraries ++ with absolute paths, such as the XView libraries, to take ++ advantage of the cache support. ++ ++ Added a minimal usage message to ldconfig. ++ ++Changes in version 1.4: ++ ++ Fixed bug in ld.so where minor version numbers were not ++ reported correctly when a minor version incompatibility ++ was found. ++ ++ Fixed bug in ldconfig where libraries with subversion ++ numbers greater than 9 were not compared correctly. ++ ++ Added Mitch D'Souza's support for suppressing warning ++ messages from ld.so about minor version incompatibilities. ++ ++ Added Mitch D'Souza's support for using a cache to speed ++ up searching for libraries in the standard directories. ++ ++ Added Mitch D'Souza's support for a debugging version of ++ ld.so. Link with -lldso if you think you are experiencing ++ dynamic linker problems. ++ ++Changes in version 1.3: ++ ++ Added support for libraries using absolute pathnames. If I ++ had known that the XView libraries used them, I would have ++ added this earlier. ++ ++ Fixed a bug handling old libraries using a pathname beginning ++ with '/' or '/lib/'. ++ ++Changes in version 1.2a: ++ ++ Fixed a minor bug in ldd which caused all files, specifically ++ scripts, to be recognized as binaries. Thanks to Olaf Flebbe ++ for reporting it. ++ ++David Engel ++david@sw.ods.com +diff -urN uClibc/ldso-0.9.24/include/.cvsignore uClibc.ldso.24/ldso-0.9.24/include/.cvsignore +--- uClibc/ldso-0.9.24/include/.cvsignore 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/.cvsignore 2003-08-19 01:05:30.000000000 -0500 +@@ -0,0 +1,4 @@ ++elf.h ++ld_syscalls.h ++ld_sysdep.h ++boot1_arch.h +diff -urN uClibc/ldso-0.9.24/include/dlfcn.h uClibc.ldso.24/ldso-0.9.24/include/dlfcn.h +--- uClibc/ldso-0.9.24/include/dlfcn.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/dlfcn.h 2003-08-19 01:05:30.000000000 -0500 +@@ -0,0 +1,22 @@ ++/* User functions for run-time dynamic loading. libdl version */ ++#ifndef _DLFCN_H ++#define _DLFCN_H 1 ++ ++#include ++#include ++ ++#define RTLD_NEXT ((void *) -1l) ++#define RTLD_DEFAULT ((void *) 0) ++ ++/* Structure containing information about object searched using ++ `dladdr'. */ ++typedef struct ++{ ++ __const char *dli_fname; /* File name of defining object. */ ++ void *dli_fbase; /* Load address of that object. */ ++ __const char *dli_sname; /* Name of nearest symbol. */ ++ void *dli_saddr; /* Exact value of nearest symbol. */ ++} Dl_info; ++ ++ ++#endif /* dlfcn.h */ +diff -urN uClibc/ldso-0.9.24/include/ld_elf.h uClibc.ldso.24/ldso-0.9.24/include/ld_elf.h +--- uClibc/ldso-0.9.24/include/ld_elf.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/ld_elf.h 2003-11-04 07:07:45.000000000 -0600 +@@ -0,0 +1,93 @@ ++#ifndef LINUXELF_H ++#define LINUXELF_H ++ ++#include /* before elf.h to get ELF_USES_RELOCA right */ ++#include ++#include ++ ++#ifdef DEBUG ++# define LDSO_CONF "../util/ld.so.conf" ++# define LDSO_CACHE "../util/ld.so.cache" ++# define LDSO_PRELOAD "../util/ld.so.preload" ++#else ++# define LDSO_CONF UCLIBC_RUNTIME_PREFIX "etc/ld.so.conf" ++# define LDSO_CACHE UCLIBC_RUNTIME_PREFIX "etc/ld.so.cache" ++# define LDSO_PRELOAD UCLIBC_RUNTIME_PREFIX "etc/ld.so.preload" ++#endif ++ ++ ++#define LIB_ANY -1 ++#define LIB_DLL 0 ++#define LIB_ELF 1 ++#define LIB_ELF64 0x80 ++#define LIB_ELF_LIBC5 2 ++#define LIB_ELF_LIBC6 3 ++#define LIB_ELF_LIBC0 4 ++ ++/* Forward declarations for stuff defined in ld_hash.h */ ++struct dyn_elf; ++struct elf_resolve; ++ ++ ++/* Definitions and prototypes for cache stuff */ ++#ifdef USE_CACHE ++extern int _dl_map_cache(void); ++extern int _dl_unmap_cache(void); ++ ++#define LDSO_CACHE_MAGIC "ld.so-" ++#define LDSO_CACHE_MAGIC_LEN (sizeof LDSO_CACHE_MAGIC -1) ++#define LDSO_CACHE_VER "1.7.0" ++#define LDSO_CACHE_VER_LEN (sizeof LDSO_CACHE_VER -1) ++ ++typedef struct { ++ char magic [LDSO_CACHE_MAGIC_LEN]; ++ char version [LDSO_CACHE_VER_LEN]; ++ int nlibs; ++} header_t; ++ ++typedef struct { ++ int flags; ++ int sooffset; ++ int liboffset; ++} libentry_t; ++ ++#else ++static inline void _dl_map_cache(void) { } ++static inline void _dl_unmap_cache(void) { } ++#endif ++ ++ ++/* Function prototypes for non-static stuff in readelflib1.c */ ++int _dl_copy_fixups(struct dyn_elf * tpnt); ++extern int _dl_parse_copy_information(struct dyn_elf *rpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type); ++extern void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type); ++extern int _dl_parse_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type); ++extern struct elf_resolve * _dl_load_shared_library(int secure, ++ struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname); ++extern struct elf_resolve * _dl_load_elf_shared_library(int secure, ++ struct dyn_elf **rpnt, char *libname); ++extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname); ++extern int _dl_linux_resolve(void); ++ ++ ++/* ++ * Datatype of a relocation on this platform ++ */ ++#ifdef ELF_USES_RELOCA ++# define ELF_RELOC ElfW(Rela) ++#else ++# define ELF_RELOC ElfW(Rel) ++#endif ++ ++ ++/* Convert between the Linux flags for page protections and the ++ ones specified in the ELF standard. */ ++#define LXFLAGS(X) ( (((X) & PF_R) ? PROT_READ : 0) | \ ++ (((X) & PF_W) ? PROT_WRITE : 0) | \ ++ (((X) & PF_X) ? PROT_EXEC : 0)) ++ ++ ++#endif /* LINUXELF_H */ +diff -urN uClibc/ldso-0.9.24/include/ld_hash.h uClibc.ldso.24/ldso-0.9.24/include/ld_hash.h +--- uClibc/ldso-0.9.24/include/ld_hash.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/ld_hash.h 2003-08-19 08:11:05.000000000 -0500 +@@ -0,0 +1,103 @@ ++#ifndef _LD_HASH_H_ ++#define _LD_HASH_H_ ++ ++#ifndef RTLD_NEXT ++#define RTLD_NEXT ((void*)-1) ++#endif ++ ++struct dyn_elf{ ++ unsigned long flags; ++ struct elf_resolve * dyn; ++ struct dyn_elf * next_handle; /* Used by dlopen et al. */ ++ struct dyn_elf * next; ++ struct dyn_elf * prev; ++}; ++ ++struct elf_resolve{ ++ /* These entries must be in this order to be compatible with the interface used ++ by gdb to obtain the list of symbols. */ ++ ElfW(Addr) loadaddr; /* Base address shared object is loaded at. */ ++ char *libname; /* Absolute file name object was found in. */ ++ ElfW(Dyn) *dynamic_addr; /* Dynamic section of the shared object. */ ++ struct elf_resolve * next; ++ struct elf_resolve * prev; ++ /* Nothing after this address is used by gdb. */ ++ enum {elf_lib, elf_executable,program_interpreter, loaded_file} libtype; ++ struct dyn_elf * symbol_scope; ++ unsigned short usage_count; ++ unsigned short int init_flag; ++ unsigned int nbucket; ++ unsigned long * elf_buckets; ++ /* ++ * These are only used with ELF style shared libraries ++ */ ++ unsigned long nchain; ++ unsigned long * chains; ++ unsigned long dynamic_info[24]; ++ ++ unsigned long dynamic_size; ++ unsigned long n_phent; ++ Elf32_Phdr * ppnt; ++ ++#if defined(__mips__) ++ /* Needed for MIPS relocation */ ++ unsigned long mips_gotsym; ++ unsigned long mips_local_gotno; ++ unsigned long mips_symtabno; ++#endif ++ ++#ifdef __powerpc__ ++ /* this is used to store the address of relocation data words, so ++ * we don't have to calculate it every time, which requires a divide */ ++ unsigned long data_words; ++#endif ++}; ++ ++#define COPY_RELOCS_DONE 1 ++#define RELOCS_DONE 2 ++#define JMP_RELOCS_DONE 4 ++#define INIT_FUNCS_CALLED 8 ++ ++extern struct dyn_elf * _dl_symbol_tables; ++extern struct elf_resolve * _dl_loaded_modules; ++extern struct dyn_elf * _dl_handles; ++ ++extern struct elf_resolve * _dl_check_hashed_files(const char * libname); ++extern struct elf_resolve * _dl_add_elf_hash_table(const char * libname, ++ char * loadaddr, unsigned long * dynamic_info, ++ unsigned long dynamic_addr, unsigned long dynamic_size); ++ ++enum caller_type{symbolrel=0,copyrel=1,resolver=2}; ++extern char * _dl_find_hash(const char * name, struct dyn_elf * rpnt1, ++ struct elf_resolve * f_tpnt, enum caller_type); ++ ++extern int _dl_linux_dynamic_link(void); ++ ++extern char * _dl_library_path; ++extern char * _dl_not_lazy; ++extern unsigned long _dl_elf_hash(const char * name); ++ ++static inline int _dl_symbol(char * name) ++{ ++ if(name[0] != '_' || name[1] != 'd' || name[2] != 'l' || name[3] != '_') ++ return 0; ++ return 1; ++} ++ ++ ++#define LD_ERROR_NOFILE 1 ++#define LD_ERROR_NOZERO 2 ++#define LD_ERROR_NOTELF 3 ++#define LD_ERROR_NOTMAGIC 4 ++#define LD_ERROR_NOTDYN 5 ++#define LD_ERROR_MMAP_FAILED 6 ++#define LD_ERROR_NODYNAMIC 7 ++#define LD_WRONG_RELOCS 8 ++#define LD_BAD_HANDLE 9 ++#define LD_NO_SYMBOL 10 ++ ++ ++ ++#endif /* _LD_HASH_H_ */ ++ ++ +diff -urN uClibc/ldso-0.9.24/include/ld_string.h uClibc.ldso.24/ldso-0.9.24/include/ld_string.h +--- uClibc/ldso-0.9.24/include/ld_string.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/ld_string.h 2003-09-29 16:46:00.000000000 -0500 +@@ -0,0 +1,281 @@ ++#ifndef _LINUX_STRING_H_ ++#define _LINUX_STRING_H_ ++ ++extern void *_dl_malloc(int size); ++extern char *_dl_getenv(const char *symbol, char **envp); ++extern void _dl_unsetenv(const char *symbol, char **envp); ++extern char *_dl_strdup(const char *string); ++extern void _dl_dprintf(int, const char *, ...); ++ ++ ++static size_t _dl_strlen(const char * str); ++static char *_dl_strcat(char *dst, const char *src); ++static char * _dl_strcpy(char * dst,const char *src); ++static int _dl_strcmp(const char * s1,const char * s2); ++static int _dl_strncmp(const char * s1,const char * s2,size_t len); ++static char * _dl_strchr(const char * str,int c); ++static char *_dl_strrchr(const char *str, int c); ++static char *_dl_strstr(const char *s1, const char *s2); ++static void * _dl_memcpy(void * dst, const void * src, size_t len); ++static int _dl_memcmp(const void * s1,const void * s2,size_t len); ++static void *_dl_memset(void * str,int c,size_t len); ++static char *_dl_get_last_path_component(char *path); ++static char *_dl_simple_ltoa(char * local, unsigned long i); ++static char *_dl_simple_ltoahex(char * local, unsigned long i); ++ ++#ifndef NULL ++#define NULL ((void *) 0) ++#endif ++ ++static inline size_t _dl_strlen(const char * str) ++{ ++ register char *ptr = (char *) str; ++ ++ while (*ptr) ++ ptr++; ++ return (ptr - str); ++} ++ ++static inline char *_dl_strcat(char *dst, const char *src) ++{ ++ register char *ptr = dst; ++ ++ while (*ptr) ++ ptr++; ++ ++ while (*src) ++ *ptr++ = *src++; ++ *ptr = '\0'; ++ ++ return dst; ++} ++ ++static inline char * _dl_strcpy(char * dst,const char *src) ++{ ++ register char *ptr = dst; ++ ++ while (*src) ++ *dst++ = *src++; ++ *dst = '\0'; ++ ++ return ptr; ++} ++ ++static inline int _dl_strcmp(const char * s1,const char * s2) ++{ ++ register unsigned char c1, c2; ++ ++ do { ++ c1 = (unsigned char) *s1++; ++ c2 = (unsigned char) *s2++; ++ if (c1 == '\0') ++ return c1 - c2; ++ } ++ while (c1 == c2); ++ ++ return c1 - c2; ++} ++ ++static inline int _dl_strncmp(const char * s1,const char * s2,size_t len) ++{ ++ register unsigned char c1 = '\0'; ++ register unsigned char c2 = '\0'; ++ ++ while (len > 0) { ++ c1 = (unsigned char) *s1++; ++ c2 = (unsigned char) *s2++; ++ if (c1 == '\0' || c1 != c2) ++ return c1 - c2; ++ len--; ++ } ++ ++ return c1 - c2; ++} ++ ++static inline char * _dl_strchr(const char * str,int c) ++{ ++ register char ch; ++ ++ do { ++ if ((ch = *str) == c) ++ return (char *) str; ++ str++; ++ } ++ while (ch); ++ ++ return 0; ++} ++ ++static inline char *_dl_strrchr(const char *str, int c) ++{ ++ register char *prev = 0; ++ register char *ptr = (char *) str; ++ ++ while (*ptr != '\0') { ++ if (*ptr == c) ++ prev = ptr; ++ ptr++; ++ } ++ if (c == '\0') ++ return(ptr); ++ return(prev); ++} ++ ++ ++static inline char *_dl_strstr(const char *s1, const char *s2) ++{ ++ register const char *s = s1; ++ register const char *p = s2; ++ ++ do { ++ if (!*p) { ++ return (char *) s1;; ++ } ++ if (*p == *s) { ++ ++p; ++ ++s; ++ } else { ++ p = s2; ++ if (!*s) { ++ return NULL; ++ } ++ s = ++s1; ++ } ++ } while (1); ++} ++ ++static inline void * _dl_memcpy(void * dst, const void * src, size_t len) ++{ ++ register char *a = dst; ++ register const char *b = src; ++ ++ while (len--) ++ *a++ = *b++; ++ ++ return dst; ++} ++ ++ ++static inline int _dl_memcmp(const void * s1,const void * s2,size_t len) ++{ ++ unsigned char *c1 = (unsigned char *)s1; ++ unsigned char *c2 = (unsigned char *)s2; ++ ++ while (len--) { ++ if (*c1 != *c2) ++ return *c1 - *c2; ++ c1++; ++ c2++; ++ } ++ return 0; ++} ++ ++static inline void * _dl_memset(void * str,int c,size_t len) ++{ ++ register char *a = str; ++ ++ while (len--) ++ *a++ = c; ++ ++ return str; ++} ++ ++static inline char *_dl_get_last_path_component(char *path) ++{ ++ char *s; ++ register char *ptr = path; ++ register char *prev = 0; ++ ++ while (*ptr) ++ ptr++; ++ s = ptr - 1; ++ ++ /* strip trailing slashes */ ++ while (s != path && *s == '/') { ++ *s-- = '\0'; ++ } ++ ++ /* find last component */ ++ ptr = path; ++ while (*ptr != '\0') { ++ if (*ptr == '/') ++ prev = ptr; ++ ptr++; ++ } ++ s = prev; ++ ++ if (s == NULL || s[1] == '\0') ++ return path; ++ else ++ return s+1; ++} ++ ++/* Early on, we can't call printf, so use this to print out ++ * numbers using the SEND_STDERR() macro */ ++static inline char *_dl_simple_ltoa(char * local, unsigned long i) ++{ ++ /* 21 digits plus null terminator, good for 64-bit or smaller ints */ ++ char *p = &local[22]; ++ *p-- = '\0'; ++ do { ++ *p-- = '0' + i % 10; ++ i /= 10; ++ } while (i > 0); ++ return p + 1; ++} ++ ++static inline char *_dl_simple_ltoahex(char * local, unsigned long i) ++{ ++ /* 21 digits plus null terminator, good for 64-bit or smaller ints */ ++ char *p = &local[22]; ++ *p-- = '\0'; ++ do { ++ char temp = i % 0x10; ++ if (temp <= 0x09) ++ *p-- = '0' + temp; ++ else ++ *p-- = 'a' - 0x0a + temp; ++ i /= 0x10; ++ } while (i > 0); ++ *p-- = 'x'; ++ *p-- = '0'; ++ return p + 1; ++} ++ ++ ++#if defined(mc68000) || defined(__arm__) || defined(__mips__) || defined(__sh__) || defined(__powerpc__) ++/* On some arches constant strings are referenced through the GOT. */ ++/* XXX Requires load_addr to be defined. */ ++#define SEND_STDERR(X) \ ++ { const char *__s = (X); \ ++ if (__s < (const char *) load_addr) __s += load_addr; \ ++ _dl_write (2, __s, _dl_strlen (__s)); \ ++ } ++#else ++#define SEND_STDERR(X) _dl_write(2, X, _dl_strlen(X)); ++#endif ++ ++#define SEND_ADDRESS_STDERR(X, add_a_newline) { \ ++ char tmp[22], *tmp1; \ ++ _dl_memset(tmp, 0, sizeof(tmp)); \ ++ tmp1=_dl_simple_ltoahex( tmp, (unsigned long)(X)); \ ++ _dl_write(2, tmp1, _dl_strlen(tmp1)); \ ++ if (add_a_newline) { \ ++ tmp[0]='\n'; \ ++ _dl_write(2, tmp, 1); \ ++ } \ ++}; ++ ++#define SEND_NUMBER_STDERR(X, add_a_newline) { \ ++ char tmp[22], *tmp1; \ ++ _dl_memset(tmp, 0, sizeof(tmp)); \ ++ tmp1=_dl_simple_ltoa( tmp, (unsigned long)(X)); \ ++ _dl_write(2, tmp1, _dl_strlen(tmp1)); \ ++ if (add_a_newline) { \ ++ tmp[0]='\n'; \ ++ _dl_write(2, tmp, 1); \ ++ } \ ++}; ++ ++ ++#endif +diff -urN uClibc/ldso-0.9.24/include/ld_syscall.h uClibc.ldso.24/ldso-0.9.24/include/ld_syscall.h +--- uClibc/ldso-0.9.24/include/ld_syscall.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/ld_syscall.h 2003-08-19 01:05:30.000000000 -0500 +@@ -0,0 +1,157 @@ ++#ifndef _LD_SYSCALL_H_ ++#define _LD_SYSCALL_H_ ++ ++/* Pull in the arch specific syscall implementation */ ++#include ++/* For MAP_ANONYMOUS -- differs between platforms */ ++#include ++/* Pull in whatever this particular arch's kernel thinks the kernel version of ++ * struct stat should look like. It turns out that each arch has a different ++ * opinion on the subject, and different kernel revs use different names... */ ++#define kernel_stat stat ++#include ++ ++ ++/* Encoding of the file mode. */ ++#define S_IFMT 0170000 /* These bits determine file type. */ ++ ++/* File types. */ ++#define S_IFDIR 0040000 /* Directory. */ ++#define S_IFCHR 0020000 /* Character device. */ ++#define S_IFBLK 0060000 /* Block device. */ ++#define S_IFREG 0100000 /* Regular file. */ ++#define S_IFIFO 0010000 /* FIFO. */ ++#define S_IFLNK 0120000 /* Symbolic link. */ ++#define S_IFSOCK 0140000 /* Socket. */ ++ ++/* Protection bits. */ ++ ++#define S_ISUID 04000 /* Set user ID on execution. */ ++#define S_ISGID 02000 /* Set group ID on execution. */ ++#define S_ISVTX 01000 /* Save swapped text after use (sticky). */ ++#define S_IREAD 0400 /* Read by owner. */ ++#define S_IWRITE 0200 /* Write by owner. */ ++#define S_IEXEC 0100 /* Execute by owner. */ ++ ++ ++/* Here are the definitions for some syscalls that are used ++ by the dynamic linker. The idea is that we want to be able ++ to call these before the errno symbol is dynamicly linked, so ++ we use our own version here. Note that we cannot assume any ++ dynamic linking at all, so we cannot return any error codes. ++ We just punt if there is an error. */ ++ ++ ++#define __NR__dl_exit __NR_exit ++static inline _syscall1(void, _dl_exit, int, status); ++ ++ ++#define __NR__dl_close __NR_close ++static inline _syscall1(int, _dl_close, int, fd); ++ ++ ++#if defined(__powerpc__) || defined(__mips__) || defined(__sh__) ++/* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */ ++#define __NR__dl_mmap __NR_mmap ++static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length, ++ int, prot, int, flags, int, fd, off_t, offset); ++#else ++#define __NR__dl_mmap_real __NR_mmap ++static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer); ++ ++static inline void * _dl_mmap(void * addr, unsigned long size, int prot, ++ int flags, int fd, unsigned long offset) ++{ ++ unsigned long buffer[6]; ++ ++ buffer[0] = (unsigned long) addr; ++ buffer[1] = (unsigned long) size; ++ buffer[2] = (unsigned long) prot; ++ buffer[3] = (unsigned long) flags; ++ buffer[4] = (unsigned long) fd; ++ buffer[5] = (unsigned long) offset; ++ return (void *) _dl_mmap_real(buffer); ++} ++#endif ++ ++#ifndef _dl_MAX_ERRNO ++#define _dl_MAX_ERRNO 4096 ++#endif ++#define _dl_mmap_check_error(__res) \ ++ (((int)__res) < 0 && ((int)__res) >= -_dl_MAX_ERRNO) ++#ifndef MAP_ANONYMOUS ++#ifdef __sparc__ ++#define MAP_ANONYMOUS 0x20 ++#else ++#error MAP_ANONYMOUS not defined and suplementary value not known ++#endif ++#endif ++ ++ ++#define __NR__dl_open __NR_open ++#define O_RDONLY 0x0000 ++#define O_WRONLY 01 ++#define O_RDWR 02 ++#define O_CREAT 0100 /* not fcntl */ ++static inline _syscall2(int, _dl_open, const char *, fn, int, flags); ++ ++#define __NR__dl_write __NR_write ++static inline _syscall3(unsigned long, _dl_write, int, fd, ++ const void *, buf, unsigned long, count); ++ ++ ++#define __NR__dl_read __NR_read ++static inline _syscall3(unsigned long, _dl_read, int, fd, ++ const void *, buf, unsigned long, count); ++ ++#define __NR__dl_mprotect __NR_mprotect ++static inline _syscall3(int, _dl_mprotect, const void *, addr, unsigned long, len, int, prot); ++ ++ ++ ++#define __NR__dl_stat __NR_stat ++static inline _syscall2(int, _dl_stat, const char *, file_name, struct stat *, buf); ++ ++ ++#define __NR__dl_munmap __NR_munmap ++static inline _syscall2(int, _dl_munmap, void *, start, unsigned long, length); ++ ++#define __NR__dl_getuid __NR_getuid ++static inline _syscall0(uid_t, _dl_getuid); ++ ++#define __NR__dl_geteuid __NR_geteuid ++static inline _syscall0(uid_t, _dl_geteuid); ++ ++#define __NR__dl_getgid __NR_getgid ++static inline _syscall0(gid_t, _dl_getgid); ++ ++#define __NR__dl_getegid __NR_getegid ++static inline _syscall0(gid_t, _dl_getegid); ++ ++#define __NR__dl_getpid __NR_getpid ++static inline _syscall0(gid_t, _dl_getpid); ++ ++/* ++ * Not an actual syscall, but we need something in assembly to say whether ++ * this is OK or not. ++ */ ++static inline int _dl_suid_ok(void) ++{ ++ uid_t uid, euid, gid, egid; ++ ++ uid = _dl_getuid(); ++ euid = _dl_geteuid(); ++ gid = _dl_getgid(); ++ egid = _dl_getegid(); ++ ++ if(uid == euid && gid == egid) ++ return 1; ++ else ++ return 0; ++} ++ ++#define __NR__dl_readlink __NR_readlink ++static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, size_t, bufsiz); ++ ++#endif /* _LD_SYSCALL_H_ */ ++ +diff -urN uClibc/ldso-0.9.24/include/ldso.h uClibc.ldso.24/ldso-0.9.24/include/ldso.h +--- uClibc/ldso-0.9.24/include/ldso.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/include/ldso.h 2003-08-19 01:05:30.000000000 -0500 +@@ -0,0 +1,11 @@ ++#include ++/* Pull in compiler and arch stuff */ ++#include ++#include ++/* Pull in the arch specific type information */ ++#include ++/* Now the ldso specific headers */ ++#include ++#include ++#include ++#include +diff -urN uClibc/ldso-0.9.24/ldso/.cvsignore uClibc.ldso.24/ldso-0.9.24/ldso/.cvsignore +--- uClibc/ldso-0.9.24/ldso/.cvsignore 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/.cvsignore 2003-08-19 01:05:31.000000000 -0500 +@@ -0,0 +1,2 @@ ++ld-uclibc.so* ++_dl_progname.h +diff -urN uClibc/ldso-0.9.24/ldso/Makefile uClibc.ldso.24/ldso-0.9.24/ldso/Makefile +--- uClibc/ldso-0.9.24/ldso/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/Makefile 2004-03-01 02:58:58.000000000 -0600 +@@ -0,0 +1,101 @@ ++# Makefile for uClibc ++# ++# Copyright (C) 2000 by Lineo, inc. ++# Copyright (C) 2000-2002 Erik Andersen ++# ++# This program is free software; you can redistribute it and/or modify it under ++# the terms of the GNU Library 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 Library General Public License for more ++# details. ++# ++# You should have received a copy of the GNU Library 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 ++# ++# Derived in part from the Linux-8086 C library, the GNU C Library, and several ++# other sundry sources. Files within this library are copyright by their ++# respective copyright holders. ++ ++ ++TOPDIR=../../ ++include $(TOPDIR)Rules.mak ++LDSO_FULLNAME=ld-uClibc-$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL).so ++ ++ ++XXFLAGS=$(XWARNINGS) $(OPTIMIZATION) $(XARCH_CFLAGS) $(CPU_CFLAGS) $(PICFLAG) \ ++ -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \ ++ -fno-builtin -nostdinc -I$(TOPDIR)ldso-0.9.24/include -I. -I$(TOPDIR)include ++ ++ifeq ($(SUPPORT_LD_DEBUG),y) ++XXFLAGS=$(XWARNINGS) $(XARCH_CFLAGS) $(CPU_CFLAGS) $(PICFLAG) \ ++ -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \ ++ -fno-builtin -nostdinc -I$(TOPDIR)ldso-0.9.24/include -I. -I$(TOPDIR)include ++# Not really much point in including debugging info, since gdb ++# can't really debug ldso, since gdb requires help from ldso to ++# debug things.... ++XXFLAGS+=-Os #-g3 ++endif ++ ++# BEWARE!!! At least mips* will die if -O0 is used!!! ++XXFLAGS :=$(XXFLAGS:-O0=-O1) ++ ++XXFLAGS+=$(shell $(CC) -print-search-dirs | sed -ne "s/install: *\(.*\)/-I\1include/gp") ++LDFLAGS=$(CPU_LDFLAGS-y) -shared --warn-common --export-dynamic --sort-common \ ++ -z combreloc --discard-locals --discard-all --no-undefined ++ ++CSRC= ldso.c #hash.c readelflib1.c $(TARGET_ARCH)/elfinterp.c ++COBJS=$(patsubst %.c,%.o, $(CSRC)) ++ASRC=$(shell ls $(TARGET_ARCH)/*.S) ++AOBJS=$(patsubst %.S,%.o, $(ASRC)) ++OBJS=$(AOBJS) $(COBJS) ++ ++ifneq ($(strip $(SUPPORT_LD_DEBUG)),y) ++LDFLAGS+=-s ++endif ++ ++ifeq ($(strip $(SUPPORT_LD_DEBUG)),y) ++XXFLAGS+=-D__SUPPORT_LD_DEBUG__ ++endif ++ ++ifeq ($(strip $(SUPPORT_LD_DEBUG_EARLY)),y) ++XXFLAGS+=-D__SUPPORT_LD_DEBUG_EARLY__ ++endif ++ ++ifeq ($(strip $(FORCE_SHAREABLE_TEXT_SEGMENTS)),y) ++XXFLAGS+=-DFORCE_SHAREABLE_TEXT_SEGMENTS ++endif ++ ++#This stuff will not work with -fomit-frame-pointer ++XXFLAGS := $(XXFLAGS:-fomit-frame-pointer=) ++ ++all: lib ++ ++lib:: _dl_progname.h $(OBJS) $(DLINK_OBJS) ++ $(LD) $(LDFLAGS) -e _dl_boot -soname=$(UCLIBC_LDSO) \ ++ -o $(LDSO_FULLNAME) $(OBJS) $(LIBGCC); ++ $(INSTALL) -d $(TOPDIR)lib ++ $(INSTALL) -m 755 $(LDSO_FULLNAME) $(TOPDIR)lib ++ $(LN) -sf $(LDSO_FULLNAME) $(TOPDIR)lib/$(UCLIBC_LDSO) ++ ++_dl_progname.h: Makefile ++ echo "const char *_dl_progname=\""$(UCLIBC_LDSO)"\";" > _dl_progname.h ++ echo "#include \"$(TARGET_ARCH)/elfinterp.c\"" >> _dl_progname.h ++ ++ ++$(COBJS): %.o : %.c ++ $(CC) $(XXFLAGS) -I../libdl -c $< -o $@ ++ $(STRIPTOOL) -x -R .note -R .comment $*.o ++ ++$(AOBJS): %.o : %.S ++ $(CC) $(XXFLAGS) -I../libdl -c $< -o $@ ++ $(STRIPTOOL) -x -R .note -R .comment $*.o ++ ++ldso.o: ldso.c hash.c readelflib1.c $(TARGET_ARCH)/elfinterp.c _dl_progname.h ++ ++clean: ++ $(RM) $(UCLIBC_LDSO)* $(OBJS) $(LDSO_FULLNAME)* core *.o *.a *.s *.i _dl_progname.h ldso.h *~ +diff -urN uClibc/ldso-0.9.24/ldso/arm/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/arm/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/arm/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/arm/boot1_arch.h 2002-11-13 18:53:49.000000000 -0600 +@@ -0,0 +1,30 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. */ ++ ++/* Overrive the default _dl_boot function, and replace it with a bit of asm. ++ * Then call the real _dl_boot function, which is now named _dl_boot2. */ ++ ++asm("" \ ++" .text\n" \ ++" .globl _dl_boot\n" \ ++"_dl_boot:\n" \ ++" mov r7, sp\n" \ ++" @ldr r0, [sp], #4\n" \ ++" mov r0, sp\n" \ ++" bl _dl_boot2\n" \ ++" mov r6, r0\n" \ ++" mov r0, r7\n" \ ++" mov pc, r6\n" \ ++); ++ ++#define _dl_boot _dl_boot2 ++#define LD_BOOT(X) static void * __attribute__ ((unused)) _dl_boot (X) ++ ++ ++ /* It seems ARM needs an offset here */ ++#undef ELFMAGIC ++#define ELFMAGIC ELFMAG+load_addr ++ ++ ++ +diff -urN uClibc/ldso-0.9.24/ldso/arm/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/arm/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/arm/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/arm/elfinterp.c 2002-11-07 21:20:59.000000000 -0600 +@@ -0,0 +1,462 @@ ++/* vi: set sw=4 ts=4: */ ++/* ARM ELF shared library loader suppport ++ * ++ * Copyright (C) 2001-2002, Erik Andersen ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes_tab[] = ++{ ++ [0] "R_ARM_NONE", "R_ARM_PC24", "R_ARM_ABS32", "R_ARM_REL32", ++ [4] "R_ARM_PC13", "R_ARM_ABS16", "R_ARM_ABS12", "R_ARM_THM_ABS5", ++ [8] "R_ARM_ABS8", "R_ARM_SBREL32","R_ARM_THM_PC22", "R_ARM_THM_PC8", ++ [12] "R_ARM_AMP_VCALL9", "R_ARM_SWI24", "R_ARM_THM_SWI8", "R_ARM_XPC25", ++ [16] "R_ARM_THM_XPC22", ++ [20] "R_ARM_COPY", "R_ARM_GLOB_DAT","R_ARM_JUMP_SLOT", "R_ARM_RELATIVE", ++ [24] "R_ARM_GOTOFF", "R_ARM_GOTPC", "R_ARM_GOT32", "R_ARM_PLT32", ++ [32] "R_ARM_ALU_PCREL_7_0","R_ARM_ALU_PCREL_15_8","R_ARM_ALU_PCREL_23_15","R_ARM_LDR_SBREL_11_0", ++ [36] "R_ARM_ALU_SBREL_19_12","R_ARM_ALU_SBREL_27_20", ++ [100] "R_ARM_GNU_VTENTRY","R_ARM_GNU_VTINHERIT","R_ARM_THM_PC11","R_ARM_THM_PC9", ++ [249] "R_ARM_RXPC25", "R_ARM_RSBREL32", "R_ARM_THM_RPC22", "R_ARM_RREL32", ++ [253] "R_ARM_RABS22", "R_ARM_RPC24", "R_ARM_RBASE", ++}; ++ ++static const char * ++_dl_reltypes(int type) ++{ ++ static char buf[22]; ++ const char *str; ++ ++ if (type >= (sizeof (_dl_reltypes_tab)/sizeof(_dl_reltypes_tab[0])) || ++ NULL == (str = _dl_reltypes_tab[type])) ++ { ++ str =_dl_simple_ltoa( buf, (unsigned long)(type)); ++ } ++ return str; ++} ++ ++static ++void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index) ++{ ++ if(_dl_debug_symbols) ++ { ++ if(symtab_index){ ++ _dl_dprintf(_dl_debug_file, "\n%s\tvalue=%x\tsize=%x\tinfo=%x\tother=%x\tshndx=%x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_value, ++ symtab[symtab_index].st_size, ++ symtab[symtab_index].st_info, ++ symtab[symtab_index].st_other, ++ symtab[symtab_index].st_shndx); ++ } ++ } ++} ++ ++static void debug_reloc(Elf32_Sym *symtab,char *strtab, ELF_RELOC *rpnt) ++{ ++ if(_dl_debug_reloc) ++ { ++ int symtab_index; ++ const char *sym; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ sym = symtab_index ? strtab + symtab[symtab_index].st_name : "sym=0x0"; ++ ++#ifdef ELF_USES_RELOCA ++ _dl_dprintf(_dl_debug_file, "\n%s\toffset=%x\taddend=%x %s", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ rpnt->r_addend, ++ sym); ++#else ++ _dl_dprintf(_dl_debug_file, "\n%s\toffset=%x %s", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ sym); ++#endif ++ } ++} ++#endif ++ ++/* Program to load an ELF binary on a linux system, and run it. ++ References to symbols in sharable libraries can be resolved by either ++ an ELF sharable library or a linux style of shared library. */ ++ ++/* Disclaimer: I have never seen any AT&T source code for SVr4, nor have ++ I ever taken any courses on internals. This program was developed using ++ information available through the book "UNIX SYSTEM V RELEASE 4, ++ Programmers guide: Ansi C and Programming Support Tools", which did ++ a more than adequate job of explaining everything required to get this ++ working. */ ++ ++extern int _dl_linux_resolve(void); ++ ++unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) ++{ ++ int reloc_type; ++ ELF_RELOC *this_reloc; ++ char *strtab; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rel_addr; ++ int symtab_index; ++ char *new_addr; ++ char **got_addr; ++ unsigned long instr_addr; ++ ++ rel_addr = (ELF_RELOC *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr); ++ ++ this_reloc = rel_addr + (reloc_entry >> 3); ++ reloc_type = ELF32_R_TYPE(this_reloc->r_info); ++ symtab_index = ELF32_R_SYM(this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ ++ if (reloc_type != R_ARM_JUMP_SLOT) { ++ _dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n", ++ _dl_progname); ++ _dl_exit(1); ++ }; ++ ++ /* Address of jump instruction to fix up */ ++ instr_addr = ((unsigned long) this_reloc->r_offset + ++ (unsigned long) tpnt->loadaddr); ++ got_addr = (char **) instr_addr; ++ ++ /* Get the address of the GOT entry */ ++ new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name, ++ tpnt->symbol_scope, tpnt, resolver); ++ if (!new_addr) { ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ _dl_exit(1); ++ }; ++#if defined (__SUPPORT_LD_DEBUG__) ++ if ((unsigned long) got_addr < 0x40000000) ++ { ++ if (_dl_debug_bindings) ++ { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", ++ strtab + symtab[symtab_index].st_name); ++ if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, ++ "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); ++ } ++ } ++ if (!_dl_debug_nofixups) { ++ *got_addr = new_addr; ++ } ++#else ++ *got_addr = new_addr; ++#endif ++ ++ return (unsigned long) new_addr; ++} ++ ++static int ++_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, ++ unsigned long rel_addr, unsigned long rel_size, ++ int (*reloc_fnc) (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab)) ++{ ++ int i; ++ char *strtab; ++ int goof = 0; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rpnt; ++ int symtab_index; ++ /* Now parse the relocation information */ ++ ++ rpnt = (ELF_RELOC *) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof(ELF_RELOC); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) { ++ int res; ++ ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ ++ /* When the dynamic linker bootstrapped itself, it resolved some symbols. ++ Make sure we do not do them again */ ++ if (!symtab_index && tpnt->libtype == program_interpreter) ++ continue; ++ if (symtab_index && tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab,strtab,symtab_index); ++ debug_reloc(symtab,strtab,rpnt); ++#endif ++ ++ res = reloc_fnc (tpnt, scope, rpnt, symtab, strtab); ++ ++ if (res==0) continue; ++ ++ _dl_dprintf(2, "\n%s: ",_dl_progname); ++ ++ if (symtab_index) ++ _dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name); ++ ++ if (res <0) ++ { ++ int reloc_type = ELF32_R_TYPE(rpnt->r_info); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); ++#else ++ _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); ++#endif ++ _dl_exit(-res); ++ } ++ else if (res >0) ++ { ++ _dl_dprintf(2, "can't resolve symbol\n"); ++ goof += res; ++ } ++ } ++ return goof; ++} ++ ++static unsigned long ++fix_bad_pc24 (unsigned long *const reloc_addr, unsigned long value) ++{ ++ static void *fix_page; ++ static unsigned int fix_offset; ++ unsigned int *fix_address; ++ if (! fix_page) ++ { ++ fix_page = _dl_mmap (NULL, 4096 , PROT_READ | PROT_WRITE | PROT_EXEC, ++ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ++ fix_offset = 0; ++ } ++ ++ fix_address = (unsigned int *)(fix_page + fix_offset); ++ fix_address[0] = 0xe51ff004; /* ldr pc, [pc, #-4] */ ++ fix_address[1] = value; ++ ++ fix_offset += 8; ++ if (fix_offset >= 4096) ++ fix_page = NULL; ++ ++ return (unsigned long)fix_address; ++} ++ ++static int ++_dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ int goof = 0; ++ ++ reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ ++ if (symtab_index) { ++ ++ symbol_addr = (unsigned long) _dl_find_hash(strtab + symtab[symtab_index].st_name, ++ scope, (reloc_type == R_ARM_JUMP_SLOT ? tpnt : NULL), symbolrel); ++ ++ /* ++ * We want to allow undefined references to weak symbols - this might ++ * have been intentional. We should not be linking local symbols ++ * here, so all bases should be covered. ++ */ ++ if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) { ++ goof++; ++ } ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ { ++ unsigned long old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_ARM_NONE: ++ break; ++ case R_ARM_ABS32: ++ *reloc_addr += symbol_addr; ++ break; ++ case R_ARM_PC24: ++ { ++ unsigned long addend; ++ long newvalue, topbits; ++ ++ addend = *reloc_addr & 0x00ffffff; ++ if (addend & 0x00800000) addend |= 0xff000000; ++ ++ newvalue = symbol_addr - (unsigned long)reloc_addr + (addend << 2); ++ topbits = newvalue & 0xfe000000; ++ if (topbits != 0xfe000000 && topbits != 0x00000000) ++ { ++ newvalue = fix_bad_pc24(reloc_addr, symbol_addr) ++ - (unsigned long)reloc_addr + (addend << 2); ++ topbits = newvalue & 0xfe000000; ++ if (topbits != 0xfe000000 && topbits != 0x00000000) ++ { ++ _dl_dprintf(2,"symbol '%s': R_ARM_PC24 relocation out of range.", ++ symtab[symtab_index].st_name); ++ _dl_exit(1); ++ } ++ } ++ newvalue >>= 2; ++ symbol_addr = (*reloc_addr & 0xff000000) | (newvalue & 0x00ffffff); ++ *reloc_addr = symbol_addr; ++ break; ++ } ++ case R_ARM_GLOB_DAT: ++ case R_ARM_JUMP_SLOT: ++ *reloc_addr = symbol_addr; ++ break; ++ case R_ARM_RELATIVE: ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ break; ++ case R_ARM_COPY: ++#if 0 ++ /* Do this later */ ++ _dl_dprintf(2, "Doing copy for symbol "); ++ if (symtab_index) _dl_dprintf(2, strtab + symtab[symtab_index].st_name); ++ _dl_dprintf(2, "\n"); ++ _dl_memcpy((void *) symtab[symtab_index].st_value, ++ (void *) symbol_addr, symtab[symtab_index].st_size); ++#endif ++ break; ++ default: ++ return -1; /*call _dl_exit(1) */ ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++ } ++ ++#endif ++ ++ return goof; ++} ++ ++static int ++_dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ unsigned long *reloc_addr; ++ ++ reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ { ++ unsigned long old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_ARM_NONE: ++ break; ++ case R_ARM_JUMP_SLOT: ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ break; ++ default: ++ return -1; /*call _dl_exit(1) */ ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatch: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++ } ++ ++#endif ++ return 0; ++ ++} ++ ++/* This is done as a separate step, because there are cases where ++ information is first copied and later initialized. This results in ++ the wrong information being copied. Someone at Sun was complaining about ++ a bug in the handling of _COPY by SVr4, and this may in fact be what he ++ was talking about. Sigh. */ ++ ++/* No, there are cases where the SVr4 linker fails to emit COPY relocs ++ at all */ ++static int ++_dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ int goof = 0; ++ ++ reloc_addr = (unsigned long *) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ if (reloc_type != R_ARM_COPY) ++ return 0; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ ++ if (symtab_index) { ++ ++ symbol_addr = (unsigned long) _dl_find_hash(strtab + ++ symtab[symtab_index].st_name, scope, ++ NULL, copyrel); ++ if (!symbol_addr) goof++; ++ } ++ if (!goof) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_move) ++ _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_size, ++ symbol_addr, symtab[symtab_index].st_value); ++#endif ++ _dl_memcpy((char *) symtab[symtab_index].st_value, ++ (char *) symbol_addr, symtab[symtab_index].st_size); ++ } ++ ++ return goof; ++} ++ ++void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void)_dl_parse(tpnt, NULL, rel_addr, rel_size, _dl_do_lazy_reloc); ++} ++ ++int _dl_parse_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ return _dl_parse(tpnt, tpnt->symbol_scope, rel_addr, rel_size, _dl_do_reloc); ++} ++ ++int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ return _dl_parse(xpnt->dyn, xpnt->next, rel_addr, rel_size, _dl_do_copy); ++} ++ +diff -urN uClibc/ldso-0.9.24/ldso/arm/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/arm/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/arm/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/arm/ld_syscalls.h 2003-09-09 01:11:11.000000000 -0500 +@@ -0,0 +1,19 @@ ++/* Define the __set_errno macro as nothing so that INLINE_SYSCALL ++ * won't set errno, which is important since we make system calls ++ * before the errno symbol is dynamicly linked. */ ++ ++#define __set_errno(X) {(void)(X);} ++ ++/* Prepare for the case that `__builtin_expect' is not available. */ ++#if __GNUC__ == 2 && __GNUC_MINOR__ < 96 ++#define __builtin_expect(x, expected_value) (x) ++#endif ++#ifndef likely ++# define likely(x) __builtin_expect((!!(x)),1) ++#endif ++#ifndef unlikely ++# define unlikely(x) __builtin_expect((!!(x)),0) ++#endif ++ ++#include "sys/syscall.h" ++ +diff -urN uClibc/ldso-0.9.24/ldso/arm/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/arm/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/arm/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/arm/ld_sysdep.h 2002-08-09 09:41:04.000000000 -0500 +@@ -0,0 +1,124 @@ ++/* ++ * Various assmbly language/system dependent hacks that are required ++ * so that we can minimize the amount of platform specific code. ++ */ ++ ++/* ++ * Define this if the system uses RELOCA. ++ */ ++#undef ELF_USES_RELOCA ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS) ++ ++/* ++ * Initialization sequence for a GOT. ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++{ \ ++ GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ ++ GOT_BASE[1] = (unsigned long) MODULE; \ ++} ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. RELP is the relocation that we ++ * are performing, REL is the pointer to the address we are relocating. ++ * SYMBOL is the symbol involved in the relocation, and LOAD is the ++ * load address. ++ */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ switch(ELF32_R_TYPE((RELP)->r_info)){ \ ++ case R_ARM_ABS32: \ ++ *REL += SYMBOL; \ ++ break; \ ++ case R_ARM_PC24: \ ++ { long newvalue, topbits; \ ++ unsigned long addend = *REL & 0x00ffffff; \ ++ if (addend & 0x00800000) addend |= 0xff000000; \ ++ newvalue=SYMBOL-(unsigned long)REL+(addend<<2); \ ++ topbits = newvalue & 0xfe000000; \ ++ if (topbits!=0xfe000000&&topbits!=0x00000000){ \ ++ newvalue = fix_bad_pc24(REL, SYMBOL) \ ++ -(unsigned long)REL+(addend<<2); \ ++ topbits = newvalue & 0xfe000000; \ ++ if (topbits!=0xfe000000&&topbits!=0x00000000){ \ ++ SEND_STDERR("R_ARM_PC24 relocation out of range\n");\ ++ _dl_exit(1); } } \ ++ newvalue>>=2; \ ++ SYMBOL=(*REL&0xff000000)|(newvalue & 0x00ffffff); \ ++ *REL=SYMBOL; \ ++ } \ ++ break; \ ++ case R_ARM_GLOB_DAT: \ ++ case R_ARM_JUMP_SLOT: \ ++ *REL = SYMBOL; \ ++ break; \ ++ case R_ARM_RELATIVE: \ ++ *REL += (unsigned long) LOAD; \ ++ break; \ ++ case R_ARM_NONE: \ ++ break; \ ++ default: \ ++ SEND_STDERR("Aiieeee!"); \ ++ _dl_exit(1); \ ++ } ++ ++ ++/* ++ * Transfer control to the user's application, once the dynamic loader ++ * is done. This routine has to exit the current function, then ++ * call the _dl_elf_main function. ++ */ ++ ++#define START() return _dl_elf_main; ++ ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++ ++#define MAGIC1 EM_ARM ++#undef MAGIC2 ++/* Used for error messages */ ++#define ELF_TARGET "ARM" ++ ++struct elf_resolve; ++unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry); ++ ++static inline unsigned long arm_modulus(unsigned long m, unsigned long p) { ++ unsigned long i,t,inc; ++ i=p; t=0; ++ while(!(i&(1<<31))) { ++ i<<=1; ++ t++; ++ } ++ t--; ++ for(inc=t;inc>2;inc--) { ++ i=p<=i) { ++ m-=i; ++ i<<=1; ++ if(i&(1<<31)) ++ break; ++ if(i=p) { ++ m-=p; ++ } ++ return m; ++} ++ ++#define do_rem(result, n, base) result=arm_modulus(n,base); ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/arm/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/arm/resolve.S +--- uClibc/ldso-0.9.24/ldso/arm/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/arm/resolve.S 2002-08-12 04:03:30.000000000 -0500 +@@ -0,0 +1,43 @@ ++/* ++ * This function is _not_ called directly. It is jumped to (so no return ++ * address is on the stack) when attempting to use a symbol that has not yet ++ * been resolved. The first time a jump symbol (such as a function call inside ++ * a shared library) is used (before it gets resolved) it will jump here to ++ * _dl_linux_resolve. When we get called the stack looks like this: ++ * reloc_entry ++ * tpnt ++ * ++ * This function saves all the registers, puts a copy of reloc_entry and tpnt ++ * on the stack (as function arguments) then make the function call ++ * _dl_linux_resolver(tpnt, reloc_entry). _dl_linux_resolver() figures out ++ * where the jump symbol is _really_ supposed to have jumped to and returns ++ * that to us. Once we have that, we overwrite tpnt with this fixed up ++ * address. We then clean up after ourselves, put all the registers back how we ++ * found them, then we jump to the fixed up address, which is where the jump ++ * symbol that got us here really wanted to jump to in the first place. ++ * -Erik Andersen ++ */ ++ ++#define sl r10 ++#define fp r11 ++#define ip r12 ++ ++.text ++.globl _dl_linux_resolve ++.type _dl_linux_resolve,%function ++.align 4; ++ ++_dl_linux_resolve: ++ stmdb sp!, {r0, r1, r2, r3, sl, fp} ++ sub r1, ip, lr ++ sub r1, r1, #4 ++ add r1, r1, r1 ++ ldr r0, [lr, #-4] ++ mov r3,r0 ++ ++ bl _dl_linux_resolver ++ ++ mov ip, r0 ++ ldmia sp!, {r0, r1, r2, r3, sl, fp, lr} ++ mov pc,ip ++.size _dl_linux_resolve, .-_dl_linux_resolve +diff -urN uClibc/ldso-0.9.24/ldso/cris/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/cris/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/cris/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/cris/boot1_arch.h 2003-09-19 07:11:43.000000000 -0500 +@@ -0,0 +1,17 @@ ++/* ++ * This code fix the stack pointer so that the dynamic linker ++ * can find argc, argv and auxvt (Auxillary Vector Table). ++ */ ++asm("" \ ++" .text\n" \ ++" .globl _dl_boot\n" \ ++" .type _dl_boot,@function\n" \ ++"_dl_boot:\n" \ ++" move.d $sp,$r10\n" \ ++" move.d $pc,$r9\n" \ ++" add.d _dl_boot2 - ., $r9\n" \ ++" jsr $r9\n" \ ++); ++ ++#define _dl_boot _dl_boot2 ++#define LD_BOOT(X) static void * __attribute__ ((unused)) _dl_boot(X) +diff -urN uClibc/ldso-0.9.24/ldso/cris/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/cris/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/cris/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/cris/elfinterp.c 2003-09-30 06:51:11.000000000 -0500 +@@ -0,0 +1,414 @@ ++/* ++ * CRIS ELF shared library loader support. ++ * ++ * Program to load an elf binary on a linux system, and run it. ++ * References to symbols in sharable libraries can be resolved ++ * by either an ELF sharable library or a linux style of shared ++ * library. ++ * ++ * Copyright (C) 2002, Axis Communications AB ++ * All rights reserved ++ * ++ * Author: Tobias Anderberg, ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++/* Support for the LD_DEBUG variable. */ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes_tab[] = { ++ [0] "R_CRIS_NONE", "R_CRIS_8", "R_CRIS_16", "R_CRIS_32", ++ [4] "R_CRIS_8_PCREL", "R_CRIS_16_PCREL", "R_CRIS_32_PCREL", "R_CRIS_GNU_VTINHERIT", ++ [8] "R_CRIS_GNU_VTENTRY", "R_CRIS_COPY", "R_CRIS_GLOB_DAT", "R_CRIS_JUMP_SLOT", ++ [16] "R_CRIS_RELATIVE", "R_CRIS_16_GOT", "R_CRIS_32_GOT", "R_CRIS_16_GOTPLT", ++ [32] "R_CRIS_32_GOTPLT", "R_CRIS_32_GOTREL", "R_CRIS_32_PLT_GOTREL", "R_CRIS_32_PLT_PCREL", ++ ++}; ++ ++ ++static const char * ++_dl_reltypes(int type) ++{ ++ const char *str; ++ static char buf[22]; ++ ++ if (type >= (sizeof(_dl_reltypes_tab)/sizeof(_dl_reltypes_tab[0])) || ++ NULL == (str = _dl_reltypes_tab[type])) ++ str = _dl_simple_ltoa(buf, (unsigned long) (type)); ++ ++ return str; ++} ++ ++static void ++debug_sym(Elf32_Sym *symtab, char *strtab, int symtab_index) ++{ ++ if (_dl_debug_symbols) { ++ if (symtab_index) { ++ _dl_dprintf(_dl_debug_file, ++ "\n%s\tvalue=%x\tsize=%x\tinfo=%x\tother=%x\tshndx=%x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_value, ++ symtab[symtab_index].st_size, ++ symtab[symtab_index].st_info, ++ symtab[symtab_index].st_other, ++ symtab[symtab_index].st_shndx); ++ } ++ } ++} ++ ++static void ++debug_reloc(Elf32_Sym *symtab, char *strtab, ELF_RELOC *rpnt) ++{ ++ if (_dl_debug_reloc) { ++ int symtab_index; ++ const char *sym; ++ ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ sym = symtab_index ? strtab + symtab[symtab_index].st_name : "sym=0x0"; ++ ++ if (_dl_debug_symbols) ++ _dl_dprintf(_dl_debug_file, "\n\t"); ++ else ++ _dl_dprintf(_dl_debug_file, "\n%s\n\t", sym); ++ ++#ifdef ELF_USES_RELOCA ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\taddend=%x", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ rpnt->r_addend); ++#else ++ _dl_dprintf(_dl_debug_file, "%s\toffset%x\n", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset); ++#endif ++ } ++} ++#endif /* __SUPPORT_LD_DEBUG__ */ ++ ++/* Defined in resolve.S. */ ++extern int _dl_linux_resolv(void); ++ ++unsigned long ++_dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) ++{ ++ int reloc_type; ++ int symtab_index; ++ char *strtab; ++ char *symname; ++ char *new_addr; ++ char *rel_addr; ++ char **got_addr; ++ Elf32_Sym *symtab; ++ ELF_RELOC *this_reloc; ++ unsigned long instr_addr; ++ ++ rel_addr = (char *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr); ++ ++ this_reloc = (ELF_RELOC *) (intptr_t)(rel_addr + reloc_entry); ++ reloc_type = ELF32_R_TYPE(this_reloc->r_info); ++ symtab_index = ELF32_R_SYM(this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *) (intptr_t)(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (reloc_type != R_CRIS_JUMP_SLOT) { ++ _dl_dprintf(2, "%s: Incorrect relocation type for jump relocations.\n", ++ _dl_progname); ++ _dl_exit(1); ++ } ++ ++ /* Fetch the address of the jump instruction to fix up. */ ++ instr_addr = ((unsigned long) this_reloc->r_offset + (unsigned long) tpnt->loadaddr); ++ got_addr = (char **) instr_addr; ++ ++ /* Fetch the address of the GOT entry. */ ++ new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, resolver); ++ ++ if (!new_addr) { ++ new_addr = _dl_find_hash(symname, NULL, NULL, resolver); ++ ++ if (new_addr) ++ return (unsigned long) new_addr; ++ ++ _dl_dprintf(2, "%s: Can't resolv symbol '%s'\n", _dl_progname, symname); ++ _dl_exit(1); ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if (_dl_debug_bindings) { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname); ++ ++ if (_dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); ++ } ++#endif ++ ++ *got_addr = new_addr; ++ return (unsigned long) new_addr; ++} ++ ++static int ++_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, unsigned long rel_addr, ++ unsigned long rel_size, int (*reloc_fnc)(struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab)) ++{ ++ int symtab_index; ++ int res; ++ unsigned int i; ++ char *strtab; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rpnt; ++ ++ /* Parse the relocation information. */ ++ rpnt = (ELF_RELOC *) (intptr_t) (rel_addr + tpnt->loadaddr); ++ rel_size /= sizeof(ELF_RELOC); ++ ++ symtab = (Elf32_Sym *) (intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) { ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ ++ /* ++ * Make sure the same symbols that the linker resolved when it ++ * bootstapped itself isn't resolved again. ++ */ ++ if (!symtab_index && tpnt->libtype == program_interpreter) ++ continue; ++ ++ if (symtab_index && tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab, strtab, symtab_index); ++ debug_reloc(symtab, strtab, rpnt); ++#endif ++ ++ /* Pass over to actual relocation function. */ ++ res = reloc_fnc(tpnt, scope, rpnt, symtab, strtab); ++ ++ if (res == 0) ++ continue; ++ ++ _dl_dprintf(2, "\n%s: ", _dl_progname); ++ ++ if (symtab_index) ++ _dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name); ++ ++ if (res < 0) { ++ int reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "can't handle relocation type '%s'\n", _dl_reltypes(reloc_type)); ++#else ++ _dl_dprintf(2, "can't handle relocation type %x\n", reloc_type); ++#endif ++ _dl_exit(-res); ++ } ++ else if (res > 0) { ++ _dl_dprintf(2, "can't resolv symbol\n"); ++ return res; ++ } ++ } ++ ++ return 0; ++} ++ ++static int ++_dl_do_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope, ELF_RELOC *rpnt, ++ Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ char *symname; ++ unsigned long *reloc_addr; ++ unsigned symbol_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ ++ reloc_addr = (unsigned long *)(intptr_t)(tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ if (symtab[symtab_index].st_shndx != SHN_UNDEF && ++ ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_LOCAL) { ++ symbol_addr = (unsigned long) tpnt->loadaddr; ++ } ++ else { ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, ++ (reloc_type == R_CRIS_JUMP_SLOT ? tpnt : NULL), symbolrel); ++ } ++ ++ if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "\tglobal symbol '%s' already defined in '%s'\n", ++ symname, tpnt->libname); ++#endif ++ return 0; ++ } ++ ++ symbol_addr += rpnt->r_addend; ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ ++ switch (reloc_type) { ++ case R_CRIS_NONE: ++ break; ++ case R_CRIS_GLOB_DAT: ++ case R_CRIS_JUMP_SLOT: ++ case R_CRIS_32: ++ case R_CRIS_COPY: ++ *reloc_addr = symbol_addr; ++ break; ++ case R_CRIS_RELATIVE: ++ *reloc_addr = (unsigned long) tpnt->loadaddr + rpnt->r_addend; ++ break; ++ default: ++ return -1; /* Call _dl_exit(1). */ ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if (_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ ++ return 0; ++} ++ ++static int ++_dl_do_lazy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope, ELF_RELOC *rpnt, ++ Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ unsigned long *reloc_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ ++ /* Don't care about these, just keep the compiler happy. */ ++ (void) scope; ++ (void) symtab; ++ (void) strtab; ++ ++ reloc_addr = (unsigned long *)(intptr_t)(tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ ++ switch (reloc_type) { ++ case R_CRIS_NONE: ++ break; ++ case R_CRIS_JUMP_SLOT: ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ break; ++ default: ++ return -1; /* Calls _dl_exit(1). */ ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if (_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ ++ return 0; ++} ++ ++static int ++_dl_do_copy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope, ELF_RELOC *rpnt, ++ Elf32_Sym *symtab, char *strtab) ++{ ++ int goof; ++ int reloc_type; ++ int symtab_index; ++ char *symname; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++ if (reloc_type != R_CRIS_COPY) ++ return 0; ++ ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ goof = 0; ++ ++ if (symtab_index) { ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, NULL, copyrel); ++ ++ if (!symbol_addr) ++ goof++; ++ } ++ ++ if (!goof) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if (_dl_debug_move) ++ _dl_dprintf(_dl_debug_file, "\n%s move %x bytes from %x to %x", ++ symname, symtab[symtab_index].st_size, symbol_addr, symtab[symtab_index].st_value); ++#endif ++ _dl_memcpy((char *) symtab[symtab_index].st_value, ++ (char *) symbol_addr, symtab[symtab_index].st_size); ++ } ++ ++ return goof; ++} ++ ++/* External interface to the generic part of the dynamic linker. */ ++ ++int ++_dl_parse_relocation_information(struct elf_resolve *tpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ /* Keep the compiler happy. */ ++ (void) type; ++ return _dl_parse(tpnt, tpnt->symbol_scope, rel_addr, rel_size, _dl_do_reloc); ++} ++void ++_dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ /* Keep the compiler happy. */ ++ (void) type; ++ _dl_parse(tpnt, NULL, rel_addr, rel_size, _dl_do_lazy_reloc); ++} ++ ++int ++_dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ /* Keep the compiler happy. */ ++ (void) type; ++ return _dl_parse(xpnt->dyn, xpnt->next, rel_addr, rel_size, _dl_do_copy_reloc); ++} +diff -urN uClibc/ldso-0.9.24/ldso/cris/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/cris/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/cris/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/cris/ld_syscalls.h 2002-09-23 05:37:16.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* ++ * Define the __set_errno macro as nothing so that INLINE_SYSCALL ++ * won't set errno, which is important since we make system calls ++ * before the errno symbol is dynamicly linked. ++ */ ++#define __set_errno(X) {(void)(X);} ++#include "sys/syscall.h" +diff -urN uClibc/ldso-0.9.24/ldso/cris/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/cris/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/cris/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/cris/ld_sysdep.h 2003-08-27 07:59:23.000000000 -0500 +@@ -0,0 +1,112 @@ ++/* CRIS can never use Elf32_Rel relocations. */ ++#define ELF_USES_RELOCA ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long *) ARGS) ++ ++/* ++ * Initialization sequence for a GOT. ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++{ \ ++ GOT_BASE[1] = (unsigned long) MODULE; \ ++ GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ ++} ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. RELP is the relocation that we ++ * are performing, REL is the pointer to the address we are relocating. ++ * SYMBOL is the symbol involved in the relocation, and LOAD is the ++ * load address. ++ */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP, REL, SYMBOL, LOAD) \ ++ switch (ELF32_R_TYPE((RELP)->r_info)) { \ ++ case R_CRIS_GLOB_DAT: \ ++ case R_CRIS_JUMP_SLOT: \ ++ case R_CRIS_32: \ ++ *REL = SYMBOL; \ ++ break; \ ++ case R_CRIS_16_PCREL: \ ++ *(short *) *REL = SYMBOL + (RELP)->r_addend - *REL - 2; \ ++ break; \ ++ case R_CRIS_32_PCREL: \ ++ *REL = SYMBOL + (RELP)->r_addend - *REL - 4; \ ++ break; \ ++ case R_CRIS_NONE: \ ++ break; \ ++ case R_CRIS_RELATIVE: \ ++ *REL = (unsigned long) LOAD + (RELP)->r_addend; \ ++ break; \ ++ default: \ ++ _dl_exit(1); \ ++ break; \ ++ } ++ ++/* ++ * Transfer control to the user's application once the dynamic loader ++ * is done. This routine has to exit the current function, then call ++ * _dl_elf_main. ++ */ ++#define START() __asm__ volatile ("moveq 0,$r8\n\t" \ ++ "move $r8,$srp\n\t" \ ++ "move.d %1,$sp\n\t" \ ++ "jump %0\n\t" \ ++ : : "r" (_dl_elf_main), "r" (args)) ++ ++/* Defined some magic numbers that this ld.so should accept. */ ++#define MAGIC1 EM_CRIS ++#undef MAGIC2 ++#define ELF_TARGET "CRIS" ++ ++struct elf_resolve; ++extern unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry); ++ ++/* Cheap modulo implementation, taken from arm/ld_sysdep.h. */ ++static inline unsigned long ++cris_mod(unsigned long m, unsigned long p) ++{ ++ unsigned long i, t, inc; ++ ++ i = p; ++ t = 0; ++ ++ while (!(i & (1 << 31))) { ++ i <<= 1; ++ t++; ++ } ++ ++ t--; ++ ++ for (inc = t; inc > 2; inc--) { ++ i = p << inc; ++ ++ if (i & (1 << 31)) ++ break; ++ ++ while (m >= i) { ++ m -= i; ++ i <<= 1; ++ if (i & (1 << 31)) ++ break; ++ if (i < p) ++ break; ++ } ++ } ++ ++ while (m >= p) ++ m -= p; ++ ++ return m; ++} ++ ++#define do_rem(result, n, base) result = cris_mod(n, base); ++ ++/* 8192 bytes alignment */ ++#define PAGE_ALIGN 0xffffe000 ++#define ADDR_ALIGN 0x1fff ++#define OFFS_ALIGN 0xffffe000 +diff -urN uClibc/ldso-0.9.24/ldso/cris/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/cris/resolve.S +--- uClibc/ldso-0.9.24/ldso/cris/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/cris/resolve.S 2002-09-16 03:11:43.000000000 -0500 +@@ -0,0 +1,48 @@ ++/* ++ * This function is _not_ called directly. It is jumped to from PLT when ++ * attempting to use a symbol that has not yet been resolved. The first ++ * time a jump symbol (such as a function call inside a shared library) ++ * is used (before it gets resolved) it will jump here. When we get called ++ * the stack contains reloc_offset and tpnt is in MOF. ++ * ++ * We save all the registers, setup R10 and R11 with the right arguments ++ * then call _dl_linux_resolver(tpnt, reloc_offset). _dl_linux_resolver() ++ * figures out where the jump symbol is _really_ supposed to have jumped to ++ * and returns that to us. Once we have that, we overwrite tpnt with this ++ * fixed up address. We then clean up after ourselves, put all the registers ++ * back how we found them, then we jump to where the fixed up address, which ++ * is where the jump symbol that got us here really wanted to jump to in the ++ * first place. ++ */ ++ ++.globl _dl_linux_resolve ++.type _dl_linux_resolve,@function ++ ++_dl_linux_resolve: ++ push $r13 ++ push $r12 ++ push $r11 ++ push $r10 ++ push $r9 ++ push $srp ++ move.d [$sp+6*4],$r11 ++ move $mof,$r10 ++#ifdef __PIC__ ++ move.d $pc,$r0 ++ sub.d .:GOTOFF,$r0 ++ move.d _dl_linux_resolver:PLTG,$r9 ++ add.d $r0,$r9 ++ jsr $r9 ++#else ++ jsr _dl_linux_resolver ++#endif ++ move.d $r10,[$sp+6*4] ++ pop $srp ++ pop $r9 ++ pop $r10 ++ pop $r11 ++ pop $r12 ++ pop $r13 ++ jump [$sp+] ++ ++ .size _dl_linux_resolve, . - _dl_linux_resolve +diff -urN uClibc/ldso-0.9.24/ldso/hash.c uClibc.ldso.24/ldso-0.9.24/ldso/hash.c +--- uClibc/ldso-0.9.24/ldso/hash.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/hash.c 2003-08-19 08:11:06.000000000 -0500 +@@ -0,0 +1,327 @@ ++/* vi: set sw=4 ts=4: */ ++/* Program to load an ELF binary on a linux system, and run it ++ * after resolving ELF shared library symbols ++ * ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, ++ * David Engel, Hongjiu Lu and Mitch D'Souza ++ * Copyright (C) 2001-2002, Erik Andersen ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++ ++/* Various symbol table handling functions, including symbol lookup */ ++ ++/* ++ * This is the start of the linked list that describes all of the files present ++ * in the system with pointers to all of the symbol, string, and hash tables, ++ * as well as all of the other good stuff in the binary. ++ */ ++ ++struct elf_resolve *_dl_loaded_modules = NULL; ++ ++/* ++ * This is the list of modules that are loaded when the image is first ++ * started. As we add more via dlopen, they get added into other ++ * chains. ++ */ ++struct dyn_elf *_dl_symbol_tables = NULL; ++ ++/* ++ * This is the list of modules that are loaded via dlopen. We may need ++ * to search these for RTLD_GLOBAL files. ++ */ ++struct dyn_elf *_dl_handles = NULL; ++ ++ ++/* ++ * This is the hash function that is used by the ELF linker to generate ++ * the hash table that each executable and library is required to ++ * have. We need it to decode the hash table. ++ */ ++ ++unsigned long _dl_elf_hash(const char *name) ++{ ++ unsigned long hash = 0; ++ unsigned long tmp; ++ ++ while (*name) { ++ hash = (hash << 4) + *name++; ++ if ((tmp = hash & 0xf0000000)) ++ hash ^= tmp >> 24; ++ hash &= ~tmp; ++ }; ++ return hash; ++} ++ ++/* ++ * Check to see if a library has already been added to the hash chain. ++ */ ++struct elf_resolve *_dl_check_hashed_files(const char *libname) ++{ ++ struct elf_resolve *tpnt; ++ int len = _dl_strlen(libname); ++ ++ for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) { ++ if (_dl_strncmp(tpnt->libname, libname, len) == 0 && ++ (tpnt->libname[len] == '\0' || tpnt->libname[len] == '.')) ++ return tpnt; ++ } ++ ++ return NULL; ++} ++ ++/* ++ * We call this function when we have just read an ELF library or executable. ++ * We add the relevant info to the symbol chain, so that we can resolve all ++ * externals properly. ++ */ ++ ++struct elf_resolve *_dl_add_elf_hash_table(const char *libname, ++ char *loadaddr, unsigned long *dynamic_info, unsigned long dynamic_addr, ++ unsigned long dynamic_size) ++{ ++ unsigned long *hash_addr; ++ struct elf_resolve *tpnt; ++ int i; ++ ++ if (!_dl_loaded_modules) { ++ tpnt = _dl_loaded_modules = ++ (struct elf_resolve *) _dl_malloc(sizeof(struct elf_resolve)); ++ _dl_memset(tpnt, 0, sizeof(struct elf_resolve)); ++ } else { ++ tpnt = _dl_loaded_modules; ++ while (tpnt->next) ++ tpnt = tpnt->next; ++ tpnt->next = (struct elf_resolve *) _dl_malloc(sizeof(struct elf_resolve)); ++ _dl_memset(tpnt->next, 0, sizeof(struct elf_resolve)); ++ tpnt->next->prev = tpnt; ++ tpnt = tpnt->next; ++ }; ++ ++ tpnt->next = NULL; ++ tpnt->init_flag = 0; ++ tpnt->libname = _dl_strdup(libname); ++ tpnt->dynamic_addr = (ElfW(Dyn) *)dynamic_addr; ++ tpnt->dynamic_size = dynamic_size; ++ tpnt->libtype = loaded_file; ++ ++ if (dynamic_info[DT_HASH] != 0) { ++ hash_addr = (unsigned long *) (intptr_t)(dynamic_info[DT_HASH] + loadaddr); ++ tpnt->nbucket = *hash_addr++; ++ tpnt->nchain = *hash_addr++; ++ tpnt->elf_buckets = hash_addr; ++ hash_addr += tpnt->nbucket; ++ tpnt->chains = hash_addr; ++ } ++ tpnt->loadaddr = (ElfW(Addr))loadaddr; ++ for (i = 0; i < 24; i++) ++ tpnt->dynamic_info[i] = dynamic_info[i]; ++#ifdef __mips__ ++ { ++ Elf32_Dyn *dpnt = (Elf32_Dyn *) dynamic_addr; ++ ++ while(dpnt->d_tag) { ++ if (dpnt->d_tag == DT_MIPS_GOTSYM) ++ tpnt->mips_gotsym = dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_MIPS_LOCAL_GOTNO) ++ tpnt->mips_local_gotno = dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_MIPS_SYMTABNO) ++ tpnt->mips_symtabno = dpnt->d_un.d_val; ++ dpnt++; ++ } ++ } ++#endif ++ return tpnt; ++} ++ ++ ++/* ++ * This function resolves externals, and this is either called when we process ++ * relocations or when we call an entry in the PLT table for the first time. ++ */ ++ ++char *_dl_find_hash(const char *name, struct dyn_elf *rpnt1, ++ struct elf_resolve *f_tpnt, enum caller_type caller_type) ++{ ++ struct elf_resolve *tpnt; ++ int si; ++ char *pnt; ++ int pass; ++ char *strtab; ++ Elf32_Sym *symtab; ++ unsigned long elf_hash_number, hn; ++ char *weak_result; ++ struct elf_resolve *first_def; ++ struct dyn_elf *rpnt, first; ++ char *data_result = 0; /* nakao */ ++ ++ weak_result = 0; ++ elf_hash_number = _dl_elf_hash(name); ++ ++ /* A quick little hack to make sure that any symbol in the executable ++ will be preferred to one in a shared library. This is necessary so ++ that any shared library data symbols referenced in the executable ++ will be seen at the same address by the executable, shared libraries ++ and dynamically loaded code. -Rob Ryan (robr@cmu.edu) */ ++ if (_dl_symbol_tables && !caller_type && rpnt1) { ++ first = (*_dl_symbol_tables); ++ first.next = rpnt1; ++ rpnt1 = (&first); ++ } ++ ++ /* ++ * The passes are so that we can first search the regular symbols ++ * for whatever module was specified, and then search anything ++ * loaded with RTLD_GLOBAL. When pass is 1, it means we are just ++ * starting the first dlopened module, and anything above that ++ * is just the next one in the chain. ++ */ ++ for (pass = 0; (1 == 1); pass++) { ++ ++ /* ++ * If we are just starting to search for RTLD_GLOBAL, setup ++ * the pointer for the start of the search. ++ */ ++ if (pass == 1) { ++ rpnt1 = _dl_handles; ++ } ++ ++ /* ++ * Anything after this, we need to skip to the next module. ++ */ ++ else if (pass >= 2) { ++ rpnt1 = rpnt1->next_handle; ++ } ++ ++ /* ++ * Make sure we still have a module, and make sure that this ++ * module was loaded with RTLD_GLOBAL. ++ */ ++ if (pass != 0) { ++ if (rpnt1 == NULL) ++ break; ++ if ((rpnt1->flags & RTLD_GLOBAL) == 0) ++ continue; ++ } ++ ++ for (rpnt = (rpnt1 ? rpnt1 : _dl_symbol_tables); rpnt; rpnt = rpnt->next) { ++ tpnt = rpnt->dyn; ++ ++ /* ++ * The idea here is that if we are using dlsym, we want to ++ * first search the entire chain loaded from dlopen, and ++ * return a result from that if we found anything. If this ++ * fails, then we continue the search into the stuff loaded ++ * when the image was activated. For normal lookups, we start ++ * with rpnt == NULL, so we should never hit this. ++ */ ++ if (tpnt->libtype == elf_executable && weak_result != 0) { ++ break; ++ } ++ ++ /* ++ * Avoid calling .urem here. ++ */ ++ do_rem(hn, elf_hash_number, tpnt->nbucket); ++ symtab = (Elf32_Sym *) (intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ /* ++ * This crap is required because the first instance of a ++ * symbol on the chain will be used for all symbol references. ++ * Thus this instance must be resolved to an address that ++ * contains the actual function, ++ */ ++ ++ first_def = NULL; ++ ++ for (si = tpnt->elf_buckets[hn]; si; si = tpnt->chains[si]) { ++ pnt = strtab + symtab[si].st_name; ++ ++ if (_dl_strcmp(pnt, name) == 0 && ++ symtab[si].st_value != 0) ++ { ++ if ((ELF32_ST_TYPE(symtab[si].st_info) == STT_FUNC || ++ ELF32_ST_TYPE(symtab[si].st_info) == STT_NOTYPE || ++ ELF32_ST_TYPE(symtab[si].st_info) == STT_OBJECT) && ++ symtab[si].st_shndx != SHN_UNDEF) { ++ ++ /* Here we make sure that we find a module where the symbol is ++ * actually defined. ++ */ ++ ++ if (f_tpnt) { ++ if (!first_def) ++ first_def = tpnt; ++ if (first_def == f_tpnt ++ && symtab[si].st_shndx == 0) ++ continue; ++ } ++ ++ switch (ELF32_ST_BIND(symtab[si].st_info)) { ++ case STB_GLOBAL: ++ if (tpnt->libtype != elf_executable && ++ ELF32_ST_TYPE(symtab[si].st_info) ++ == STT_NOTYPE) ++ { /* nakao */ ++ data_result = (char *)tpnt->loadaddr + ++ symtab[si].st_value; /* nakao */ ++ break; /* nakao */ ++ } else /* nakao */ ++ return (char*)tpnt->loadaddr + symtab[si].st_value; ++ case STB_WEAK: ++ if (!weak_result) ++ weak_result = (char *)tpnt->loadaddr + symtab[si].st_value; ++ break; ++ default: /* Do local symbols need to be examined? */ ++ break; ++ } ++ } ++#ifndef __mips__ ++ /* ++ * References to the address of a function from an executable file and ++ * the shared objects associated with it might not resolve to the same ++ * value. To allow comparisons of function addresses we must resolve ++ * to the address of the plt entry of the executable instead of the ++ * real function address. ++ * see "TIS ELF Specification Version 1.2, Book 3, A-11 (Function ++ * Adresses) ++ */ ++ if (resolver != caller_type && ++ NULL==f_tpnt && /*trick: don't handle R_??_JMP_SLOT reloc type*/ ++ tpnt->libtype == elf_executable && ++ ELF32_ST_TYPE(symtab[si].st_info) == STT_FUNC && ++ symtab[si].st_shndx == SHN_UNDEF) ++ { ++ return (char*)symtab[si].st_value; ++ } ++#endif ++ } ++ } ++ } ++ } ++ if (data_result) ++ return data_result; /* nakao */ ++ return weak_result; ++} +diff -urN uClibc/ldso-0.9.24/ldso/i386/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/i386/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/i386/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/i386/boot1_arch.h 2002-08-08 09:35:31.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. See arm/boot1_arch.h for an example of what ++ * can be done. ++ */ ++ ++#define LD_BOOT(X) void _dl_boot (X) +diff -urN uClibc/ldso-0.9.24/ldso/i386/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/i386/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/i386/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/i386/elfinterp.c 2003-11-06 16:09:38.000000000 -0600 +@@ -0,0 +1,415 @@ ++/* vi: set sw=4 ts=4: */ ++/* i386 ELF shared library loader suppport ++ * ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, ++ * David Engel, Hongjiu Lu and Mitch D'Souza ++ * Copyright (C) 2001-2002, Erik Andersen ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes_tab[] = ++{ ++ [0] "R_386_NONE", "R_386_32", "R_386_PC32", "R_386_GOT32", ++ [4] "R_386_PLT32", "R_386_COPY", "R_386_GLOB_DAT", "R_386_JMP_SLOT", ++ [8] "R_386_RELATIVE", "R_386_GOTOFF", "R_386_GOTPC", ++}; ++ ++static const char * ++_dl_reltypes(int type) ++{ ++ static char buf[22]; ++ const char *str; ++ ++ if (type >= (int)(sizeof (_dl_reltypes_tab)/sizeof(_dl_reltypes_tab[0])) || ++ NULL == (str = _dl_reltypes_tab[type])) ++ { ++ str =_dl_simple_ltoa( buf, (unsigned long)(type)); ++ } ++ return str; ++} ++ ++static ++void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index) ++{ ++ if(_dl_debug_symbols) ++ { ++ if(symtab_index){ ++ _dl_dprintf(_dl_debug_file, "\n%s\n\tvalue=%x\tsize=%x\tinfo=%x\tother=%x\tshndx=%x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_value, ++ symtab[symtab_index].st_size, ++ symtab[symtab_index].st_info, ++ symtab[symtab_index].st_other, ++ symtab[symtab_index].st_shndx); ++ } ++ } ++} ++ ++static void debug_reloc(Elf32_Sym *symtab,char *strtab, ELF_RELOC *rpnt) ++{ ++ if(_dl_debug_reloc) ++ { ++ int symtab_index; ++ const char *sym; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ sym = symtab_index ? strtab + symtab[symtab_index].st_name : "sym=0x0"; ++ ++ if(_dl_debug_symbols) ++ _dl_dprintf(_dl_debug_file, "\n\t"); ++ else ++ _dl_dprintf(_dl_debug_file, "\n%s\n\t", sym); ++#ifdef ELF_USES_RELOCA ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\taddend=%x", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ rpnt->r_addend); ++#else ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\n", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset); ++#endif ++ } ++} ++#endif ++ ++/* Program to load an ELF binary on a linux system, and run it. ++ References to symbols in sharable libraries can be resolved by either ++ an ELF sharable library or a linux style of shared library. */ ++ ++/* Disclaimer: I have never seen any AT&T source code for SVr4, nor have ++ I ever taken any courses on internals. This program was developed using ++ information available through the book "UNIX SYSTEM V RELEASE 4, ++ Programmers guide: Ansi C and Programming Support Tools", which did ++ a more than adequate job of explaining everything required to get this ++ working. */ ++ ++extern int _dl_linux_resolve(void); ++ ++unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) ++{ ++ int reloc_type; ++ ELF_RELOC *this_reloc; ++ char *strtab; ++ Elf32_Sym *symtab; ++ int symtab_index; ++ char *rel_addr; ++ char *new_addr; ++ char **got_addr; ++ unsigned long instr_addr; ++ char *symname; ++ ++ rel_addr = (char *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr); ++ ++ this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry); ++ reloc_type = ELF32_R_TYPE(this_reloc->r_info); ++ symtab_index = ELF32_R_SYM(this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ symname= strtab + symtab[symtab_index].st_name; ++ ++ if (reloc_type != R_386_JMP_SLOT) { ++ _dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n", ++ _dl_progname); ++ _dl_exit(1); ++ } ++ ++ /* Address of jump instruction to fix up */ ++ instr_addr = ((unsigned long) this_reloc->r_offset + ++ (unsigned long) tpnt->loadaddr); ++ got_addr = (char **) instr_addr; ++ ++ /* Get the address of the GOT entry */ ++ new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, resolver); ++ if (!new_addr) { ++ new_addr = _dl_find_hash(symname, NULL, NULL, resolver); ++ if (new_addr) { ++ return (unsigned long) new_addr; ++ } ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname); ++ _dl_exit(1); ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if ((unsigned long) got_addr < 0x40000000) ++ { ++ if (_dl_debug_bindings) ++ { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname); ++ if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, ++ "\n\tpatched %x ==> %x @ %x\n", *got_addr, new_addr, got_addr); ++ } ++ } ++ if (!_dl_debug_nofixups) { ++ *got_addr = new_addr; ++ } ++#else ++ *got_addr = new_addr; ++#endif ++ ++ return (unsigned long) new_addr; ++} ++ ++static int ++_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, ++ unsigned long rel_addr, unsigned long rel_size, ++ int (*reloc_fnc) (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab)) ++{ ++ unsigned int i; ++ char *strtab; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rpnt; ++ int symtab_index; ++ ++ /* Now parse the relocation information */ ++ rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof(ELF_RELOC); ++ ++ symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) { ++ int res; ++ ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ ++ /* When the dynamic linker bootstrapped itself, it resolved some symbols. ++ Make sure we do not do them again */ ++ if (!symtab_index && tpnt->libtype == program_interpreter) ++ continue; ++ if (symtab_index && tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab,strtab,symtab_index); ++ debug_reloc(symtab,strtab,rpnt); ++#endif ++ ++ res = reloc_fnc (tpnt, scope, rpnt, symtab, strtab); ++ ++ if (res==0) continue; ++ ++ _dl_dprintf(2, "\n%s: ",_dl_progname); ++ ++ if (symtab_index) ++ _dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name); ++ ++ if (res <0) ++ { ++ int reloc_type = ELF32_R_TYPE(rpnt->r_info); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); ++#else ++ _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); ++#endif ++ _dl_exit(-res); ++ } ++ else if (res >0) ++ { ++ _dl_dprintf(2, "can't resolve symbol\n"); ++ return res; ++ } ++ } ++ return 0; ++} ++ ++ ++static int ++_dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ char *symname; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, ++ (reloc_type == R_386_JMP_SLOT ? tpnt : NULL), symbolrel); ++ ++ /* ++ * We want to allow undefined references to weak symbols - this might ++ * have been intentional. We should not be linking local symbols ++ * here, so all bases should be covered. ++ */ ++ ++ if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "\tglobal symbol '%s' already defined in '%s'\n", ++ symname, tpnt->libname); ++#endif ++ return 0; ++ } ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_386_NONE: ++ break; ++ case R_386_32: ++ *reloc_addr += symbol_addr; ++ break; ++ case R_386_PC32: ++ *reloc_addr += symbol_addr - (unsigned long) reloc_addr; ++ break; ++ case R_386_GLOB_DAT: ++ case R_386_JMP_SLOT: ++ *reloc_addr = symbol_addr; ++ break; ++ case R_386_RELATIVE: ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ break; ++ case R_386_COPY: ++ /* handled later on */ ++ break; ++ default: ++ return -1; /*call _dl_exit(1) */ ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ ++ return 0; ++} ++ ++static int ++_dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ unsigned long *reloc_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ (void)scope; ++ (void)symtab; ++ (void)strtab; ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_386_NONE: ++ break; ++ case R_386_JMP_SLOT: ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ break; ++ default: ++ return -1; /*call _dl_exit(1) */ ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ return 0; ++ ++} ++ ++/* This is done as a separate step, because there are cases where ++ information is first copied and later initialized. This results in ++ the wrong information being copied. Someone at Sun was complaining about ++ a bug in the handling of _COPY by SVr4, and this may in fact be what he ++ was talking about. Sigh. */ ++ ++/* No, there are cases where the SVr4 linker fails to emit COPY relocs ++ at all */ ++static int ++_dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ int goof = 0; ++ char *symname; ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ if (reloc_type != R_386_COPY) ++ return 0; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, NULL, copyrel); ++ if (!symbol_addr) goof++; ++ } ++ if (!goof) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_move) ++ _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", ++ symname, symtab[symtab_index].st_size, ++ symbol_addr, symtab[symtab_index].st_value); ++#endif ++ _dl_memcpy((char *) symtab[symtab_index].st_value, ++ (char *) symbol_addr, symtab[symtab_index].st_size); ++ } ++ ++ return goof; ++} ++ ++void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void) type; ++ (void)_dl_parse(tpnt, NULL, rel_addr, rel_size, _dl_do_lazy_reloc); ++} ++ ++int _dl_parse_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void) type; ++ return _dl_parse(tpnt, tpnt->symbol_scope, rel_addr, rel_size, _dl_do_reloc); ++} ++ ++int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ (void) type; ++ return _dl_parse(xpnt->dyn, xpnt->next, rel_addr, rel_size, _dl_do_copy); ++} ++ +diff -urN uClibc/ldso-0.9.24/ldso/i386/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/i386/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/i386/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/i386/ld_syscalls.h 2002-08-09 07:20:21.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* Define the __set_errno macro as nothing so that INLINE_SYSCALL ++ * won't set errno, which is important since we make system calls ++ * before the errno symbol is dynamicly linked. */ ++ ++#define __set_errno(X) {(void)(X);} ++#include "sys/syscall.h" ++ +diff -urN uClibc/ldso-0.9.24/ldso/i386/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/i386/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/i386/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/i386/ld_sysdep.h 2002-05-28 16:33:32.000000000 -0500 +@@ -0,0 +1,81 @@ ++/* ++ * Various assmbly language/system dependent hacks that are required ++ * so that we can minimize the amount of platform specific code. ++ */ ++ ++/* ++ * Define this if the system uses RELOCA. ++ */ ++#undef ELF_USES_RELOCA ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) & ARGS) ++ ++/* ++ * Initialization sequence for a GOT. ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++{ \ ++ GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ ++ GOT_BASE[1] = (unsigned long) MODULE; \ ++} ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. RELP is the relocation that we ++ * are performing, REL is the pointer to the address we are relocating. ++ * SYMBOL is the symbol involved in the relocation, and LOAD is the ++ * load address. ++ */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ switch(ELF32_R_TYPE((RELP)->r_info)){ \ ++ case R_386_32: \ ++ *REL += SYMBOL; \ ++ break; \ ++ case R_386_PC32: \ ++ *REL += SYMBOL - (unsigned long) REL; \ ++ break; \ ++ case R_386_GLOB_DAT: \ ++ case R_386_JMP_SLOT: \ ++ *REL = SYMBOL; \ ++ break; \ ++ case R_386_RELATIVE: \ ++ *REL += (unsigned long) LOAD; \ ++ break; \ ++ default: \ ++ _dl_exit(1); \ ++ } ++ ++ ++/* ++ * Transfer control to the user's application, once the dynamic loader ++ * is done. This routine has to exit the current function, then ++ * call the _dl_elf_main function. ++ */ ++#define START() \ ++ __asm__ volatile ("leave\n\t" \ ++ "jmp *%%eax\n\t" \ ++ : "=a" (status) : "a" (_dl_elf_main)) ++ ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++ ++#define MAGIC1 EM_386 ++#undef MAGIC2 ++/* Used for error messages */ ++#define ELF_TARGET "386" ++ ++struct elf_resolve; ++extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry); ++ ++#define do_rem(result, n, base) result = (n % base) ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/i386/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/i386/resolve.S +--- uClibc/ldso-0.9.24/ldso/i386/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/i386/resolve.S 2001-06-14 16:51:51.000000000 -0500 +@@ -0,0 +1,52 @@ ++/* ++ * This function is _not_ called directly. It is jumped to (so no return ++ * address is on the stack) when attempting to use a symbol that has not yet ++ * been resolved. The first time a jump symbol (such as a function call inside ++ * a shared library) is used (before it gets resolved) it will jump here to ++ * _dl_linux_resolve. When we get called the stack looks like this: ++ * reloc_entry ++ * tpnt ++ * ++ * This function saves all the registers, puts a copy of reloc_entry and tpnt ++ * on the stack (as function arguments) then make the function call ++ * _dl_linux_resolver(tpnt, reloc_entry). _dl_linux_resolver() figures out ++ * where the jump symbol is _really_ supposed to have jumped to and returns ++ * that to us. Once we have that, we overwrite tpnt with this fixed up ++ * address. We then clean up after ourselves, put all the registers back how we ++ * found them, then we jump to where the fixed up address, which is where the ++ * jump symbol that got us here really wanted to jump to in the first place. ++ * found them, then we jump to the fixed up address, which is where the jump ++ * symbol that got us here really wanted to jump to in the first place. ++ * -Erik Andersen ++ */ ++ ++.text ++.align 4 ++ ++.globl _dl_linux_resolve ++.type _dl_linux_resolve,@function ++ ++_dl_linux_resolve: ++ pusha /* preserve all regs */ ++ lea 0x20(%esp),%eax /* eax = tpnt and reloc_entry params */ ++ pushl 4(%eax) /* push copy of reloc_entry param */ ++ pushl (%eax) /* push copy of tpnt param */ ++ ++#ifdef __PIC__ ++ call .L24 ++.L24: ++ popl %ebx ++ addl $_GLOBAL_OFFSET_TABLE_+[.-.L24],%ebx ++ movl _dl_linux_resolver@GOT(%ebx),%ebx /* eax = resolved func */ ++ call *%ebx ++#else ++ call _dl_linux_resolver ++#endif ++ movl %eax,0x28(%esp) /* store func addr over original ++ * tpnt param */ ++ addl $0x8,%esp /* remove copy parameters */ ++ popa /* restore regs */ ++ ret $4 /* jump to func removing original ++ * reloc_entry param from stack */ ++.LFE2: ++ .size _dl_linux_resolve,.LFE2-_dl_linux_resolve +diff -urN uClibc/ldso-0.9.24/ldso/ldso.c uClibc.ldso.24/ldso-0.9.24/ldso/ldso.c +--- uClibc/ldso-0.9.24/ldso/ldso.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/ldso.c 2003-12-05 14:24:26.000000000 -0600 +@@ -0,0 +1,1296 @@ ++/* vi: set sw=4 ts=4: */ ++/* Program to load an ELF binary on a linux system, and run it ++ * after resolving ELF shared library symbols ++ * ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, ++ * David Engel, Hongjiu Lu and Mitch D'Souza ++ * Copyright (C) 2001-2002, Erik Andersen ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++// Support a list of library preloads in /etc/ld.so.preload ++//#define SUPPORT_LDSO_PRELOAD_FILE ++ ++ ++/* Disclaimer: I have never seen any AT&T source code for SVr4, nor have ++ I ever taken any courses on internals. This program was developed using ++ information available through the book "UNIX SYSTEM V RELEASE 4, ++ Programmers guide: Ansi C and Programming Support Tools", which did ++ a more than adequate job of explaining everything required to get this ++ working. */ ++ ++/* ++ * The main trick with this program is that initially, we ourselves are ++ * not dynamicly linked. This means that we cannot access any global ++ * variables or call any functions. No globals initially, since the ++ * Global Offset Table (GOT) is initialized by the linker assuming a ++ * virtual address of 0, and no function calls initially since the ++ * Procedure Linkage Table (PLT) is not yet initialized. ++ * ++ * There are additional initial restrictions - we cannot use large ++ * switch statements, since the compiler generates tables of addresses ++ * and jumps through them. We can use inline functions, because these ++ * do not transfer control to a new address, but they must be static so ++ * that they are not exported from the modules. We cannot use normal ++ * syscall stubs, because these all reference the errno global variable ++ * which is not yet initialized. We can use all of the local stack ++ * variables that we want. ++ * ++ * Life is further complicated by the fact that initially we do not ++ * want to do a complete dynamic linking. We want to allow the user to ++ * supply new functions to override symbols (i.e. weak symbols and/or ++ * LD_PRELOAD). So initially, we only perform relocations for ++ * variables that start with "_dl_" since ANSI specifies that the user ++ * is not supposed to redefine any of these variables. ++ * ++ * Fortunately, the linker itself leaves a few clues lying around, and ++ * when the kernel starts the image, there are a few further clues. ++ * First of all, there is Auxiliary Vector Table information sitting on ++ * which is provided to us by the kernel, and which includes ++ * information about the load address that the program interpreter was ++ * loaded at, the number of sections, the address the application was ++ * loaded at and so forth. Here this information is stored in the ++ * array auxvt. For details see linux/fs/binfmt_elf.c where it calls ++ * NEW_AUX_ENT() a bunch of time.... ++ * ++ * Next, we need to find the GOT. On most arches there is a register ++ * pointing to the GOT, but just in case (and for new ports) I've added ++ * some (slow) C code to locate the GOT for you. ++ * ++ * This code was originally written for SVr4, and there the kernel ++ * would load all text pages R/O, so they needed to call mprotect a ++ * zillion times to mark all text pages as writable so dynamic linking ++ * would succeed. Then when they were done, they would change the ++ * protections for all the pages back again. Well, under Linux ++ * everything is loaded writable (since Linux does copy on write ++ * anyways) so all the mprotect stuff has been disabled. ++ * ++ * Initially, we do not have access to _dl_malloc since we can't yet ++ * make function calls, so we mmap one page to use as scratch space. ++ * Later on, when we can call _dl_malloc we reuse this this memory. ++ * This is also beneficial, since we do not want to use the same memory ++ * pool as malloc anyway - esp if the user redefines malloc to do ++ * something funky. ++ * ++ * Our first task is to perform a minimal linking so that we can call ++ * other portions of the dynamic linker. Once we have done this, we ++ * then build the list of modules that the application requires, using ++ * LD_LIBRARY_PATH if this is not a suid program (/usr/lib otherwise). ++ * Once this is done, we can do the dynamic linking as required, and we ++ * must omit the things we did to get the dynamic linker up and running ++ * in the first place. After we have done this, we just have a few ++ * housekeeping chores and we can transfer control to the user's ++ * application. ++ */ ++ ++#include "ldso.h" ++ ++ ++#define ALLOW_ZERO_PLTGOT ++ ++/* Some arches may need to override this in boot1_arch.h */ ++#define ELFMAGIC ELFMAG ++ ++/* This is a poor man's malloc, used prior to resolving our internal poor man's malloc */ ++#define LD_MALLOC(SIZE) ((void *) (malloc_buffer += SIZE, malloc_buffer - SIZE)) ; REALIGN(); ++/* ++ * Make sure that the malloc buffer is aligned on 4 byte boundary. For 64 bit ++ * platforms we may need to increase this to 8, but this is good enough for ++ * now. This is typically called after LD_MALLOC. ++ */ ++#define REALIGN() malloc_buffer = (char *) (((unsigned long) malloc_buffer + 3) & ~(3)) ++ ++char *_dl_library_path = 0; /* Where we look for libraries */ ++char *_dl_preload = 0; /* Things to be loaded before the libs. */ ++char *_dl_ldsopath = 0; ++static int _dl_be_lazy = RTLD_LAZY; ++#ifdef __SUPPORT_LD_DEBUG__ ++char *_dl_debug = 0; ++char *_dl_debug_symbols = 0; ++char *_dl_debug_move = 0; ++char *_dl_debug_reloc = 0; ++char *_dl_debug_detail = 0; ++char *_dl_debug_nofixups = 0; ++char *_dl_debug_bindings = 0; ++int _dl_debug_file = 2; ++#else ++#define _dl_debug_file 2 ++#endif ++static char *_dl_malloc_addr, *_dl_mmap_zero; ++ ++static char *_dl_trace_loaded_objects = 0; ++static int (*_dl_elf_main) (int, char **, char **); ++struct r_debug *_dl_debug_addr = NULL; ++unsigned long *_dl_brkp; ++unsigned long *_dl_envp; ++int _dl_fixup(struct elf_resolve *tpnt, int lazy); ++void _dl_debug_state(void); ++char *_dl_get_last_path_component(char *path); ++static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt, ++ unsigned long load_addr, unsigned long *hash_addr, Elf32_auxv_t auxvt[AT_EGID + 1], ++ char **envp, struct r_debug *debug_addr); ++ ++#include "boot1_arch.h" ++#include "_dl_progname.h" /* Pull in the value of _dl_progname */ ++ ++/* When we enter this piece of code, the program stack looks like this: ++ argc argument counter (integer) ++ argv[0] program name (pointer) ++ argv[1...N] program args (pointers) ++ argv[argc-1] end of args (integer) ++ NULL ++ env[0...N] environment variables (pointers) ++ NULL ++ auxvt[0...N] Auxiliary Vector Table elements (mixed types) ++*/ ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++/* Debugging is especially tricky on PowerPC, since string literals ++ * require relocations. Thus, you can't use _dl_dprintf() for ++ * anything until the bootstrap relocations are finished. */ ++static inline void hexprint(unsigned long x) ++{ ++ int i; ++ char c; ++ ++ for (i = 0; i < 8; i++) { ++ c = ((x >> 28) + '0'); ++ if (c > '9') ++ c += 'a' - '9' - 1; ++ _dl_write(1, &c, 1); ++ x <<= 4; ++ } ++ c = '\n'; ++ _dl_write(1, &c, 1); ++} ++#endif ++ ++LD_BOOT(unsigned long args) __attribute__ ((unused)); ++ ++LD_BOOT(unsigned long args) ++{ ++ unsigned int argc; ++ char **argv, **envp; ++ unsigned long load_addr; ++ unsigned long *got; ++ unsigned long *aux_dat; ++ int goof = 0; ++ ElfW(Ehdr) *header; ++ struct elf_resolve *tpnt; ++ struct elf_resolve *app_tpnt; ++ Elf32_auxv_t auxvt[AT_EGID + 1]; ++ unsigned char *malloc_buffer, *mmap_zero; ++ Elf32_Dyn *dpnt; ++ unsigned long *hash_addr; ++ struct r_debug *debug_addr = NULL; ++ int indx; ++ int status; ++ ++ ++ /* WARNING! -- we cannot make _any_ funtion calls until we have ++ * taken care of fixing up our own relocations. Making static ++ * inline calls is ok, but _no_ function calls. Not yet ++ * anyways. */ ++ ++ /* First obtain the information on the stack that tells us more about ++ what binary is loaded, where it is loaded, etc, etc */ ++ GET_ARGV(aux_dat, args); ++#if defined (__arm__) || defined (__mips__) || defined (__cris__) ++ aux_dat += 1; ++#endif ++ argc = *(aux_dat - 1); ++ argv = (char **) aux_dat; ++ aux_dat += argc; /* Skip over the argv pointers */ ++ aux_dat++; /* Skip over NULL at end of argv */ ++ envp = (char **) aux_dat; ++ while (*aux_dat) ++ aux_dat++; /* Skip over the envp pointers */ ++ aux_dat++; /* Skip over NULL at end of envp */ ++ ++ /* Place -1 here as a checkpoint. We later check if it was changed ++ * when we read in the auxvt */ ++ auxvt[AT_UID].a_type = -1; ++ ++ /* The junk on the stack immediately following the environment is ++ * the Auxiliary Vector Table. Read out the elements of the auxvt, ++ * sort and store them in auxvt for later use. */ ++ while (*aux_dat) { ++ Elf32_auxv_t *auxv_entry = (Elf32_auxv_t *) aux_dat; ++ ++ if (auxv_entry->a_type <= AT_EGID) { ++ _dl_memcpy(&(auxvt[auxv_entry->a_type]), auxv_entry, sizeof(Elf32_auxv_t)); ++ } ++ aux_dat += 2; ++ } ++ ++ /* locate the ELF header. We need this done as soon as possible ++ * (esp since SEND_STDERR() needs this on some platforms... */ ++ load_addr = auxvt[AT_BASE].a_un.a_val; ++ header = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_ptr; ++ ++ /* Check the ELF header to make sure everything looks ok. */ ++ if (!header || header->e_ident[EI_CLASS] != ELFCLASS32 || ++ header->e_ident[EI_VERSION] != EV_CURRENT ++#if !defined(__powerpc__) && !defined(__mips__) && !defined(__sh__) ++ || _dl_strncmp((void *) header, ELFMAGIC, SELFMAG) != 0 ++#else ++ || header->e_ident[EI_MAG0] != ELFMAG0 ++ || header->e_ident[EI_MAG1] != ELFMAG1 ++ || header->e_ident[EI_MAG2] != ELFMAG2 ++ || header->e_ident[EI_MAG3] != ELFMAG3 ++#endif ++ ) { ++ SEND_STDERR("Invalid ELF header\n"); ++ _dl_exit(0); ++ } ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("ELF header="); ++ SEND_ADDRESS_STDERR(load_addr, 1); ++#endif ++ ++ ++ /* Locate the global offset table. Since this code must be PIC ++ * we can take advantage of the magic offset register, if we ++ * happen to know what that is for this architecture. If not, ++ * we can always read stuff out of the ELF file to find it... */ ++#if defined(__i386__) ++ __asm__("\tmovl %%ebx,%0\n\t":"=a"(got)); ++#elif defined(__m68k__) ++ __asm__("movel %%a5,%0":"=g"(got)) ++#elif defined(__sparc__) ++ __asm__("\tmov %%l7,%0\n\t":"=r"(got)) ++#elif defined(__arm__) ++ __asm__("\tmov %0, r10\n\t":"=r"(got)); ++#elif defined(__powerpc__) ++ __asm__("\tbl _GLOBAL_OFFSET_TABLE_-4@local\n\t":"=l"(got)); ++#elif defined(__mips__) ++ __asm__("\tmove %0, $28\n\tsubu %0,%0,0x7ff0\n\t":"=r"(got)); ++#elif defined(__sh__) ++ __asm__( ++" mov.l 1f, %0\n" ++" mova 1f, r0\n" ++" bra 2f\n" ++" add r0, %0\n" ++" .balign 4\n" ++"1: .long _GLOBAL_OFFSET_TABLE_\n" ++"2:" : "=r" (got) : : "r0"); ++#elif defined(__cris__) ++ __asm__("\tmove.d $pc,%0\n\tsub.d .:GOTOFF,%0\n\t":"=r"(got)); ++#else ++ /* Do things the slow way in C */ ++ { ++ unsigned long tx_reloc; ++ Elf32_Dyn *dynamic = NULL; ++ Elf32_Shdr *shdr; ++ Elf32_Phdr *pt_load; ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("Finding the GOT using C code to read the ELF file\n"); ++#endif ++ /* Find where the dynamic linking information section is hiding */ ++ shdr = (Elf32_Shdr *) (header->e_shoff + (char *) header); ++ for (indx = header->e_shnum; --indx >= 0; ++shdr) { ++ if (shdr->sh_type == SHT_DYNAMIC) { ++ goto found_dynamic; ++ } ++ } ++ SEND_STDERR("missing dynamic linking information section \n"); ++ _dl_exit(0); ++ ++ found_dynamic: ++ dynamic = (Elf32_Dyn *) (shdr->sh_offset + (char *) header); ++ ++ /* Find where PT_LOAD is hiding */ ++ pt_load = (Elf32_Phdr *) (header->e_phoff + (char *) header); ++ for (indx = header->e_phnum; --indx >= 0; ++pt_load) { ++ if (pt_load->p_type == PT_LOAD) { ++ goto found_pt_load; ++ } ++ } ++ SEND_STDERR("missing loadable program segment\n"); ++ _dl_exit(0); ++ ++ found_pt_load: ++ /* Now (finally) find where DT_PLTGOT is hiding */ ++ tx_reloc = pt_load->p_vaddr - pt_load->p_offset; ++ for (; DT_NULL != dynamic->d_tag; ++dynamic) { ++ if (dynamic->d_tag == DT_PLTGOT) { ++ goto found_got; ++ } ++ } ++ SEND_STDERR("missing global offset table\n"); ++ _dl_exit(0); ++ ++ found_got: ++ got = (unsigned long *) (dynamic->d_un.d_val - tx_reloc + ++ (char *) header); ++ } ++#endif ++ ++ /* Now, finally, fix up the location of the dynamic stuff */ ++ dpnt = (Elf32_Dyn *) (*got + load_addr); ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("First Dynamic section entry="); ++ SEND_ADDRESS_STDERR(dpnt, 1); ++#endif ++ ++ ++ /* Call mmap to get a page of writable memory that can be used ++ * for _dl_malloc throughout the shared lib loader. */ ++ mmap_zero = malloc_buffer = _dl_mmap((void *) 0, 4096, ++ PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); ++ if (_dl_mmap_check_error(mmap_zero)) { ++ SEND_STDERR("dl_boot: mmap of a spare page failed!\n"); ++ _dl_exit(13); ++ } ++ ++ tpnt = LD_MALLOC(sizeof(struct elf_resolve)); ++ _dl_memset(tpnt, 0, sizeof(struct elf_resolve)); ++ app_tpnt = LD_MALLOC(sizeof(struct elf_resolve)); ++ _dl_memset(app_tpnt, 0, sizeof(struct elf_resolve)); ++ ++ /* ++ * This is used by gdb to locate the chain of shared libraries that are currently loaded. ++ */ ++ debug_addr = LD_MALLOC(sizeof(struct r_debug)); ++ _dl_memset(debug_addr, 0, sizeof(struct r_debug)); ++ ++ /* OK, that was easy. Next scan the DYNAMIC section of the image. ++ We are only doing ourself right now - we will have to do the rest later */ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("scanning DYNAMIC section\n"); ++#endif ++ while (dpnt->d_tag) { ++#if defined(__mips__) ++ if (dpnt->d_tag == DT_MIPS_GOTSYM) ++ tpnt->mips_gotsym = (unsigned long) dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_MIPS_LOCAL_GOTNO) ++ tpnt->mips_local_gotno = (unsigned long) dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_MIPS_SYMTABNO) ++ tpnt->mips_symtabno = (unsigned long) dpnt->d_un.d_val; ++#endif ++ if (dpnt->d_tag < 24) { ++ tpnt->dynamic_info[dpnt->d_tag] = dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_TEXTREL) { ++ tpnt->dynamic_info[DT_TEXTREL] = 1; ++ } ++ } ++ dpnt++; ++ } ++ ++ { ++ ElfW(Phdr) *ppnt; ++ int i; ++ ++ ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_ptr; ++ for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++) ++ if (ppnt->p_type == PT_DYNAMIC) { ++ dpnt = (Elf32_Dyn *) ppnt->p_vaddr; ++ while (dpnt->d_tag) { ++#if defined(__mips__) ++ if (dpnt->d_tag == DT_MIPS_GOTSYM) ++ app_tpnt->mips_gotsym = ++ (unsigned long) dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_MIPS_LOCAL_GOTNO) ++ app_tpnt->mips_local_gotno = ++ (unsigned long) dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_MIPS_SYMTABNO) ++ app_tpnt->mips_symtabno = ++ (unsigned long) dpnt->d_un.d_val; ++ if (dpnt->d_tag > DT_JMPREL) { ++ dpnt++; ++ continue; ++ } ++ app_tpnt->dynamic_info[dpnt->d_tag] = dpnt->d_un.d_val; ++ ++#warning "Debugging threads on mips won't work till someone fixes this..." ++#if 0 ++ if (dpnt->d_tag == DT_DEBUG) { ++ dpnt->d_un.d_val = (unsigned long) debug_addr; ++ } ++#endif ++ ++#else ++ if (dpnt->d_tag > DT_JMPREL) { ++ dpnt++; ++ continue; ++ } ++ app_tpnt->dynamic_info[dpnt->d_tag] = dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_DEBUG) { ++ dpnt->d_un.d_val = (unsigned long) debug_addr; ++ } ++#endif ++ if (dpnt->d_tag == DT_TEXTREL) ++ app_tpnt->dynamic_info[DT_TEXTREL] = 1; ++ dpnt++; ++ } ++ } ++ } ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("done scanning DYNAMIC section\n"); ++#endif ++ ++ /* Get some more of the information that we will need to dynamicly link ++ this module to itself */ ++ ++ hash_addr = (unsigned long *) (tpnt->dynamic_info[DT_HASH] + load_addr); ++ tpnt->nbucket = *hash_addr++; ++ tpnt->nchain = *hash_addr++; ++ tpnt->elf_buckets = hash_addr; ++ hash_addr += tpnt->nbucket; ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("done grabbing link information\n"); ++#endif ++ ++#ifndef FORCE_SHAREABLE_TEXT_SEGMENTS ++ /* Ugly, ugly. We need to call mprotect to change the protection of ++ the text pages so that we can do the dynamic linking. We can set the ++ protection back again once we are done */ ++ ++ { ++ ElfW(Phdr) *ppnt; ++ int i; ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("calling mprotect on the shared library/dynamic linker\n"); ++#endif ++ ++ /* First cover the shared library/dynamic linker. */ ++ if (tpnt->dynamic_info[DT_TEXTREL]) { ++ header = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_ptr; ++ ppnt = (ElfW(Phdr) *) ((int)auxvt[AT_BASE].a_un.a_ptr + ++ header->e_phoff); ++ for (i = 0; i < header->e_phnum; i++, ppnt++) { ++ if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) { ++ _dl_mprotect((void *) (load_addr + (ppnt->p_vaddr & PAGE_ALIGN)), ++ (ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz, ++ PROT_READ | PROT_WRITE | PROT_EXEC); ++ } ++ } ++ } ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("calling mprotect on the application program\n"); ++#endif ++ /* Now cover the application program. */ ++ if (app_tpnt->dynamic_info[DT_TEXTREL]) { ++ ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_ptr; ++ for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++) { ++ if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) ++ _dl_mprotect((void *) (ppnt->p_vaddr & PAGE_ALIGN), ++ (ppnt->p_vaddr & ADDR_ALIGN) + ++ (unsigned long) ppnt->p_filesz, ++ PROT_READ | PROT_WRITE | PROT_EXEC); ++ } ++ } ++ } ++#endif ++ ++#if defined(__mips__) ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("About to do MIPS specific GOT bootstrap\n"); ++#endif ++ /* For MIPS we have to do stuff to the GOT before we do relocations. */ ++ PERFORM_BOOTSTRAP_GOT(got); ++#endif ++ ++ /* OK, now do the relocations. We do not do a lazy binding here, so ++ that once we are done, we have considerably more flexibility. */ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("About to do library loader relocations\n"); ++#endif ++ ++ goof = 0; ++ for (indx = 0; indx < 2; indx++) { ++ unsigned int i; ++ ELF_RELOC *rpnt; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ int symtab_index; ++ unsigned long rel_addr, rel_size; ++ ++ ++#ifdef ELF_USES_RELOCA ++ rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] : tpnt-> ++ dynamic_info[DT_RELA]); ++ rel_size = (indx ? tpnt->dynamic_info[DT_PLTRELSZ] : tpnt-> ++ dynamic_info[DT_RELASZ]); ++#else ++ rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] : tpnt-> ++ dynamic_info[DT_REL]); ++ rel_size = (indx ? tpnt->dynamic_info[DT_PLTRELSZ] : tpnt-> ++ dynamic_info[DT_RELSZ]); ++#endif ++ ++ if (!rel_addr) ++ continue; ++ ++ /* Now parse the relocation information */ ++ rpnt = (ELF_RELOC *) (rel_addr + load_addr); ++ for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) { ++ reloc_addr = (unsigned long *) (load_addr + (unsigned long) rpnt->r_offset); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ if (symtab_index) { ++ char *strtab; ++ Elf32_Sym *symtab; ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + load_addr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + load_addr); ++ ++ /* We only do a partial dynamic linking right now. The user ++ is not supposed to redefine any symbols that start with ++ a '_', so we can do this with confidence. */ ++ if (!_dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ symbol_addr = load_addr + symtab[symtab_index].st_value; ++ ++ if (!symbol_addr) { ++ /* This will segfault - you cannot call a function until ++ * we have finished the relocations. ++ */ ++ SEND_STDERR("ELF dynamic loader - unable to self-bootstrap - symbol "); ++ SEND_STDERR(strtab + symtab[symtab_index].st_name); ++ SEND_STDERR(" undefined.\n"); ++ goof++; ++ } ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ SEND_STDERR("About to fixup symbol: "); ++ SEND_STDERR(strtab + symtab[symtab_index].st_name); ++ SEND_STDERR("\n"); ++#endif ++ } ++ /* ++ * Use this machine-specific macro to perform the actual relocation. ++ */ ++ PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr); ++ } ++ } ++ ++ if (goof) { ++ _dl_exit(14); ++ } ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ /* Wahoo!!! */ ++ _dl_dprintf(_dl_debug_file, "Done relocating library loader, so we can now\n\tuse globals and make function calls!\n"); ++#endif ++ ++ if (argv[0]) { ++ _dl_progname = argv[0]; ++ } ++ ++ /* Start to build the tables of the modules that are required for ++ * this beast to run. We start with the basic executable, and then ++ * go from there. Eventually we will run across ourself, and we ++ * will need to properly deal with that as well. */ ++ ++ /* Make it so _dl_malloc can use the page of memory we have already ++ * allocated, so we shouldn't need to grab any more memory */ ++ _dl_malloc_addr = malloc_buffer; ++ _dl_mmap_zero = mmap_zero; ++ ++ ++ ++ /* Now we have done the mandatory linking of some things. We are now ++ free to start using global variables, since these things have all been ++ fixed up by now. Still no function calls outside of this library , ++ since the dynamic resolver is not yet ready. */ ++ _dl_get_ready_to_run(tpnt, app_tpnt, load_addr, hash_addr, auxvt, envp, debug_addr); ++ ++ ++ /* Notify the debugger that all objects are now mapped in. */ ++ _dl_debug_addr->r_state = RT_CONSISTENT; ++ _dl_debug_state(); ++ ++ ++ /* OK we are done here. Turn out the lights, and lock up. */ ++ _dl_elf_main = (int (*)(int, char **, char **)) auxvt[AT_ENTRY].a_un.a_fcn; ++ ++ /* ++ * Transfer control to the application. ++ */ ++ status = 0; /* Used on x86, but not on other arches */ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file,"\ntransfering control: %s\n\n", _dl_progname); ++#endif ++ START(); ++} ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static void debug_fini (int status, void *arg) ++{ ++ (void)status; ++ _dl_dprintf(_dl_debug_file,"\ncalling fini: %s\n\n", (const char*)arg); ++} ++#endif ++ ++static void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt, ++ unsigned long load_addr, unsigned long *hash_addr, Elf32_auxv_t auxvt[AT_EGID + 1], ++ char **envp, struct r_debug *debug_addr) ++{ ++ ElfW(Phdr) *ppnt; ++ char *lpntstr; ++ int i, _dl_secure, goof = 0; ++ struct dyn_elf *rpnt; ++ struct elf_resolve *tcurr; ++ struct elf_resolve *tpnt1; ++ unsigned long brk_addr, *lpnt; ++ int (*_dl_atexit) (void *); ++#if defined (__SUPPORT_LD_DEBUG__) ++ int (*_dl_on_exit) (void (*FUNCTION)(int STATUS, void *ARG),void*); ++#endif ++ ++ /* Now we have done the mandatory linking of some things. We are now ++ free to start using global variables, since these things have all been ++ fixed up by now. Still no function calls outside of this library , ++ since the dynamic resolver is not yet ready. */ ++ lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + load_addr); ++ ++ tpnt->chains = hash_addr; ++ tpnt->next = 0; ++ tpnt->libname = 0; ++ tpnt->libtype = program_interpreter; ++ tpnt->loadaddr = (ElfW(Addr)) load_addr; ++ ++#ifdef ALLOW_ZERO_PLTGOT ++ if (tpnt->dynamic_info[DT_PLTGOT]) ++#endif ++ { ++ INIT_GOT(lpnt, tpnt); ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "GOT found at %x\n", lpnt); ++#endif ++ } ++ ++ /* OK, this was a big step, now we need to scan all of the user images ++ and load them properly. */ ++ ++ { ++ ElfW(Ehdr) *epnt; ++ ElfW(Phdr) *myppnt; ++ int j; ++ ++ epnt = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_ptr; ++ tpnt->n_phent = epnt->e_phnum; ++ tpnt->ppnt = myppnt = (ElfW(Phdr) *) (load_addr + epnt->e_phoff); ++ for (j = 0; j < epnt->e_phnum; j++, myppnt++) { ++ if (myppnt->p_type == PT_DYNAMIC) { ++ tpnt->dynamic_addr = (ElfW(Dyn) *)myppnt->p_vaddr + load_addr; ++ tpnt->dynamic_size = myppnt->p_filesz; ++ } ++ } ++ } ++ ++ brk_addr = 0; ++ rpnt = NULL; ++ ++ /* At this point we are now free to examine the user application, ++ and figure out which libraries are supposed to be called. Until ++ we have this list, we will not be completely ready for dynamic linking */ ++ ++ ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_ptr; ++ for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++) { ++ if (ppnt->p_type == PT_LOAD) { ++ if (ppnt->p_vaddr + ppnt->p_memsz > brk_addr) ++ brk_addr = ppnt->p_vaddr + ppnt->p_memsz; ++ } ++ if (ppnt->p_type == PT_DYNAMIC) { ++#ifndef ALLOW_ZERO_PLTGOT ++ /* make sure it's really there. */ ++ if (app_tpnt->dynamic_info[DT_PLTGOT] == 0) ++ continue; ++#endif ++ /* OK, we have what we need - slip this one into the list. */ ++ app_tpnt = _dl_add_elf_hash_table("", 0, ++ app_tpnt->dynamic_info, ppnt->p_vaddr, ppnt->p_filesz); ++ _dl_loaded_modules->libtype = elf_executable; ++ _dl_loaded_modules->ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_ptr; ++ _dl_loaded_modules->n_phent = auxvt[AT_PHNUM].a_un.a_val; ++ _dl_symbol_tables = rpnt = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); ++ _dl_memset(rpnt, 0, sizeof(struct dyn_elf)); ++ rpnt->dyn = _dl_loaded_modules; ++ app_tpnt->usage_count++; ++ app_tpnt->symbol_scope = _dl_symbol_tables; ++ lpnt = (unsigned long *) (app_tpnt->dynamic_info[DT_PLTGOT]); ++#ifdef ALLOW_ZERO_PLTGOT ++ if (lpnt) ++#endif ++ INIT_GOT(lpnt, _dl_loaded_modules); ++ } ++ ++ /* OK, fill this in - we did not have this before */ ++ if (ppnt->p_type == PT_INTERP) { ++ int readsize = 0; ++ char *pnt, *pnt1, buf[1024]; ++ tpnt->libname = _dl_strdup((char *) ppnt->p_offset + ++ (auxvt[AT_PHDR].a_un.a_val & PAGE_ALIGN)); ++ ++ /* Determine if the shared lib loader is a symlink */ ++ _dl_memset(buf, 0, sizeof(buf)); ++ readsize = _dl_readlink(tpnt->libname, buf, sizeof(buf)); ++ if (readsize > 0 && readsize < (int)(sizeof(buf)-1)) { ++ pnt1 = _dl_strrchr(buf, '/'); ++ if (pnt1 && buf != pnt1) { ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "changing tpnt->libname from '%s' to '%s'\n", tpnt->libname, buf); ++#endif ++ tpnt->libname = _dl_strdup(buf); ++ } ++ } ++ ++ /* Store the path where the shared lib loader was found for ++ * later use */ ++ pnt = _dl_strdup(tpnt->libname); ++ pnt1 = _dl_strrchr(pnt, '/'); ++ if (pnt != pnt1) { ++ *pnt1 = '\0'; ++ _dl_ldsopath = pnt; ++ } else { ++ _dl_ldsopath = tpnt->libname; ++ } ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "Lib Loader:\t(%x) %s\n", tpnt->loadaddr, tpnt->libname); ++#endif ++ } ++ } ++ ++ ++ /* Now we need to figure out what kind of options are selected. ++ Note that for SUID programs we ignore the settings in LD_LIBRARY_PATH */ ++ { ++ if (_dl_getenv("LD_BIND_NOW", envp)) ++ _dl_be_lazy = 0; ++ ++ if ((auxvt[AT_UID].a_un.a_val == -1 && _dl_suid_ok()) || ++ (auxvt[AT_UID].a_un.a_val != -1 && ++ auxvt[AT_UID].a_un.a_val == auxvt[AT_EUID].a_un.a_val ++ && auxvt[AT_GID].a_un.a_val== auxvt[AT_EGID].a_un.a_val)) { ++ _dl_secure = 0; ++ _dl_preload = _dl_getenv("LD_PRELOAD", envp); ++ _dl_library_path = _dl_getenv("LD_LIBRARY_PATH", envp); ++ } else { ++ _dl_secure = 1; ++ _dl_preload = _dl_getenv("LD_PRELOAD", envp); ++ _dl_unsetenv("LD_AOUT_PRELOAD", envp); ++ _dl_unsetenv("LD_LIBRARY_PATH", envp); ++ _dl_unsetenv("LD_AOUT_LIBRARY_PATH", envp); ++ _dl_library_path = NULL; ++ } ++ } ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ _dl_debug = _dl_getenv("LD_DEBUG", envp); ++ if (_dl_debug) ++ { ++ if (_dl_strstr(_dl_debug, "all")) { ++ _dl_debug_detail = _dl_debug_move = _dl_debug_symbols ++ = _dl_debug_reloc = _dl_debug_bindings = _dl_debug_nofixups = _dl_strstr(_dl_debug, "all"); ++ } ++ else { ++ _dl_debug_detail = _dl_strstr(_dl_debug, "detail"); ++ _dl_debug_move = _dl_strstr(_dl_debug, "move"); ++ _dl_debug_symbols = _dl_strstr(_dl_debug, "sym"); ++ _dl_debug_reloc = _dl_strstr(_dl_debug, "reloc"); ++ _dl_debug_nofixups = _dl_strstr(_dl_debug, "nofix"); ++ _dl_debug_bindings = _dl_strstr(_dl_debug, "bind"); ++ } ++ } ++ { ++ const char *dl_debug_output; ++ ++ dl_debug_output = _dl_getenv("LD_DEBUG_OUTPUT", envp); ++ ++ if (dl_debug_output) ++ { ++ char tmp[22], *tmp1, *filename; ++ int len1, len2; ++ ++ _dl_memset(tmp, 0, sizeof(tmp)); ++ tmp1=_dl_simple_ltoa( tmp, (unsigned long)_dl_getpid()); ++ ++ len1 = _dl_strlen(dl_debug_output); ++ len2 = _dl_strlen(tmp1); ++ ++ filename = _dl_malloc(len1+len2+2); ++ ++ if (filename) ++ { ++ _dl_strcpy (filename, dl_debug_output); ++ filename[len1] = '.'; ++ _dl_strcpy (&filename[len1+1], tmp1); ++ ++ _dl_debug_file= _dl_open (filename, O_WRONLY|O_CREAT); ++ if (_dl_debug_file<0) ++ { ++ _dl_debug_file = 2; ++ _dl_dprintf (2, "can't open file: '%s'\n",filename); ++ } ++ } ++ } ++ } ++ ++ ++#endif ++ _dl_trace_loaded_objects = _dl_getenv("LD_TRACE_LOADED_OBJECTS", envp); ++#ifndef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects) { ++ _dl_dprintf(_dl_debug_file, "Use the ldd provided by uClibc\n"); ++ _dl_exit(1); ++ } ++#endif ++ ++ /* ++ * OK, fix one more thing - set up debug_addr so it will point ++ * to our chain. Later we may need to fill in more fields, but this ++ * should be enough for now. ++ */ ++ debug_addr->r_map = (struct link_map *) _dl_loaded_modules; ++ debug_addr->r_version = 1; ++ debug_addr->r_ldbase = load_addr; ++ debug_addr->r_brk = (unsigned long) &_dl_debug_state; ++ _dl_debug_addr = debug_addr; ++ ++ /* Notify the debugger we are in a consistant state */ ++ _dl_debug_addr->r_state = RT_CONSISTENT; ++ _dl_debug_state(); ++ ++ /* OK, we now have the application in the list, and we have some ++ basic stuff in place. Now search through the list for other shared ++ libraries that should be loaded, and insert them on the list in the ++ correct order. */ ++ ++ _dl_map_cache(); ++ ++ ++ if (_dl_preload) ++ { ++ char c, *str, *str2; ++ ++ str = _dl_preload; ++ while (*str == ':' || *str == ' ' || *str == '\t') ++ str++; ++ while (*str) ++ { ++ str2 = str; ++ while (*str2 && *str2 != ':' && *str2 != ' ' && *str2 != '\t') ++ str2++; ++ c = *str2; ++ *str2 = '\0'; ++ if (!_dl_secure || _dl_strchr(str, '/') == NULL) ++ { ++ if ((tpnt1 = _dl_check_if_named_library_is_loaded(str))) ++ { ++ continue; ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s'; needed by '%s'\n", ++ str, _dl_progname); ++#endif ++ tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str); ++ if (!tpnt1) { ++#ifdef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects) ++ _dl_dprintf(1, "\t%s => not found\n", str); ++ else ++#endif ++ { ++ _dl_dprintf(2, "%s: can't load " "library '%s'\n", _dl_progname, str); ++ _dl_exit(15); ++ } ++ } else { ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); ++#endif ++#ifdef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects && tpnt1->usage_count==1) { ++ /* this is a real hack to make ldd not print ++ * the library itself when run on a library. */ ++ if (_dl_strcmp(_dl_progname, str) != 0) ++ _dl_dprintf(1, "\t%s => %s (%x)\n", str, tpnt1->libname, ++ (unsigned) tpnt1->loadaddr); ++ } ++#endif ++ } ++ } ++ *str2 = c; ++ str = str2; ++ while (*str == ':' || *str == ' ' || *str == '\t') ++ str++; ++ } ++ } ++ ++#ifdef SUPPORT_LDSO_PRELOAD_FILE ++ { ++ int fd; ++ struct stat st; ++ char *preload; ++ if (!_dl_stat(LDSO_PRELOAD, &st) && st.st_size > 0) { ++ if ((fd = _dl_open(LDSO_PRELOAD, O_RDONLY)) < 0) { ++ _dl_dprintf(2, "%s: can't open file '%s'\n", ++ _dl_progname, LDSO_PRELOAD); ++ } else { ++ preload = (caddr_t) _dl_mmap(0, st.st_size + 1, ++ PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); ++ _dl_close(fd); ++ if (preload == (caddr_t) - 1) { ++ _dl_dprintf(2, "%s: can't map file '%s'\n", ++ _dl_progname, LDSO_PRELOAD); ++ } else { ++ char c, *cp, *cp2; ++ ++ /* convert all separators and comments to spaces */ ++ for (cp = preload; *cp; /*nada */ ) { ++ if (*cp == ':' || *cp == '\t' || *cp == '\n') { ++ *cp++ = ' '; ++ } else if (*cp == '#') { ++ do ++ *cp++ = ' '; ++ while (*cp != '\n' && *cp != '\0'); ++ } else { ++ cp++; ++ } ++ } ++ ++ /* find start of first library */ ++ for (cp = preload; *cp && *cp == ' '; cp++) ++ /*nada */ ; ++ ++ while (*cp) { ++ /* find end of library */ ++ for (cp2 = cp; *cp && *cp != ' '; cp++) ++ /*nada */ ; ++ c = *cp; ++ *cp = '\0'; ++ ++ if ((tpnt1 = _dl_check_if_named_library_is_loaded(cp2))) ++ { ++ continue; ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s'; needed by '%s'\n", ++ cp2, _dl_progname); ++#endif ++ tpnt1 = _dl_load_shared_library(0, &rpnt, NULL, cp2); ++ if (!tpnt1) { ++#ifdef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects) ++ _dl_dprintf(1, "\t%s => not found\n", cp2); ++ else ++#endif ++ { ++ _dl_dprintf(2, "%s: can't load library '%s'\n", _dl_progname, cp2); ++ _dl_exit(15); ++ } ++ } else { ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); ++#endif ++#ifdef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects && tpnt1->usage_count==1) { ++ _dl_dprintf(1, "\t%s => %s (%x)\n", cp2, ++ tpnt1->libname, (unsigned) tpnt1->loadaddr); ++ } ++#endif ++ } ++ ++ /* find start of next library */ ++ *cp = c; ++ for ( /*nada */ ; *cp && *cp == ' '; cp++) ++ /*nada */ ; ++ } ++ ++ _dl_munmap(preload, st.st_size + 1); ++ } ++ } ++ } ++ } ++#endif ++ ++ for (tcurr = _dl_loaded_modules; tcurr; tcurr = tcurr->next) ++ { ++ Elf32_Dyn *dpnt; ++ for (dpnt = (Elf32_Dyn *) tcurr->dynamic_addr; dpnt->d_tag; dpnt++) ++ { ++ if (dpnt->d_tag == DT_NEEDED) ++ { ++ char *name; ++ lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val); ++ name = _dl_get_last_path_component(lpntstr); ++ ++ if ((tpnt1 = _dl_check_if_named_library_is_loaded(name))) ++ { ++ continue; ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfile='%s'; needed by '%s'\n", ++ lpntstr, _dl_progname); ++#endif ++ if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr))) ++ { ++#ifdef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects) { ++ _dl_dprintf(1, "\t%s => not found\n", lpntstr); ++ continue; ++ } else ++#endif ++ { ++ _dl_dprintf(2, "%s: can't load library '%s'\n", _dl_progname, lpntstr); ++ _dl_exit(16); ++ } ++ } else { ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); ++#endif ++#ifdef __LDSO_LDD_SUPPORT__ ++ if (_dl_trace_loaded_objects && tpnt1->usage_count==1) { ++ _dl_dprintf(1, "\t%s => %s (%x)\n", lpntstr, tpnt1->libname, ++ (unsigned) tpnt1->loadaddr); ++ } ++#endif ++ } ++ } ++ } ++ } ++ ++ ++ _dl_unmap_cache(); ++ ++ /* ++ * If the program interpreter is not in the module chain, add it. This will ++ * be required for dlopen to be able to access the internal functions in the ++ * dynamic linker. ++ */ ++ if (tpnt) { ++ tcurr = _dl_loaded_modules; ++ if (tcurr) ++ while (tcurr->next) ++ tcurr = tcurr->next; ++ tpnt->next = NULL; ++ tpnt->usage_count++; ++ ++ if (tcurr) { ++ tcurr->next = tpnt; ++ tpnt->prev = tcurr; ++ } else { ++ _dl_loaded_modules = tpnt; ++ tpnt->prev = NULL; ++ } ++ if (rpnt) { ++ rpnt->next = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); ++ _dl_memset(rpnt->next, 0, sizeof(struct dyn_elf)); ++ rpnt->next->prev = rpnt; ++ rpnt = rpnt->next; ++ } else { ++ rpnt = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); ++ _dl_memset(rpnt, 0, sizeof(struct dyn_elf)); ++ } ++ rpnt->dyn = tpnt; ++ tpnt = NULL; ++ } ++ ++#ifdef __LDSO_LDD_SUPPORT__ ++ /* End of the line for ldd.... */ ++ if (_dl_trace_loaded_objects) { ++ _dl_dprintf(1, "\t%s => %s (%x)\n", rpnt->dyn->libname + (_dl_strlen(_dl_ldsopath)) + 1, ++ rpnt->dyn->libname, rpnt->dyn->loadaddr); ++ _dl_exit(0); ++ } ++#endif ++ ++ ++#ifdef __mips__ ++ /* ++ * Relocation of the GOT entries for MIPS have to be done ++ * after all the libraries have been loaded. ++ */ ++ _dl_perform_mips_global_got_relocations(_dl_loaded_modules); ++#endif ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "Beginning relocation fixups\n"); ++#endif ++ /* ++ * OK, now all of the kids are tucked into bed in their proper addresses. ++ * Now we go through and look for REL and RELA records that indicate fixups ++ * to the GOT tables. We need to do this in reverse order so that COPY ++ * directives work correctly */ ++ goof = _dl_loaded_modules ? _dl_fixup(_dl_loaded_modules, _dl_be_lazy) : 0; ++ ++ ++ /* Some flavors of SVr4 do not generate the R_*_COPY directive, ++ and we have to manually search for entries that require fixups. ++ Solaris gets this one right, from what I understand. */ ++ ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(_dl_debug_file, "Beginning copy fixups\n"); ++#endif ++ if (_dl_symbol_tables) ++ goof += _dl_copy_fixups(_dl_symbol_tables); ++ ++ /* OK, at this point things are pretty much ready to run. Now we ++ need to touch up a few items that are required, and then ++ we can let the user application have at it. Note that ++ the dynamic linker itself is not guaranteed to be fully ++ dynamicly linked if we are using ld.so.1, so we have to look ++ up each symbol individually. */ ++ ++ ++ _dl_brkp = (unsigned long *) (intptr_t) _dl_find_hash("___brk_addr", NULL, NULL, symbolrel); ++ ++ if (_dl_brkp) { ++ *_dl_brkp = brk_addr; ++ } ++ _dl_envp = (unsigned long *) (intptr_t) _dl_find_hash("__environ", NULL, NULL, symbolrel); ++ ++ if (_dl_envp) { ++ *_dl_envp = (unsigned long) envp; ++ } ++ ++#ifndef FORCE_SHAREABLE_TEXT_SEGMENTS ++ { ++ unsigned int j; ++ ElfW(Phdr) *myppnt; ++ ++ /* We had to set the protections of all pages to R/W for dynamic linking. ++ Set text pages back to R/O */ ++ for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) { ++ for (myppnt = tpnt->ppnt, j = 0; j < tpnt->n_phent; j++, myppnt++) { ++ if (myppnt->p_type == PT_LOAD && !(myppnt->p_flags & PF_W) && tpnt->dynamic_info[DT_TEXTREL]) { ++ _dl_mprotect((void *) (tpnt->loadaddr + (myppnt->p_vaddr & PAGE_ALIGN)), ++ (myppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) myppnt->p_filesz, LXFLAGS(myppnt->p_flags)); ++ } ++ } ++ } ++ ++ } ++#endif ++ _dl_atexit = (int (*)(void *)) (intptr_t) _dl_find_hash("atexit", NULL, NULL, symbolrel); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_on_exit = (int (*)(void (*)(int, void *),void*)) ++ (intptr_t) _dl_find_hash("on_exit", NULL, NULL, symbolrel); ++#endif ++ ++ /* Notify the debugger we have added some objects. */ ++ _dl_debug_addr->r_state = RT_ADD; ++ _dl_debug_state(); ++ ++ for (rpnt = _dl_symbol_tables; rpnt!=NULL&& rpnt->next!=NULL; rpnt=rpnt->next) ++ ; ++ ++ for (;rpnt!=NULL; rpnt=rpnt->prev) ++ { ++ tpnt = rpnt->dyn; ++ ++ if (tpnt->libtype == program_interpreter) ++ continue; ++ ++ /* Apparently crt0/1 for the application is responsible for handling this. ++ * We only need to run the init/fini for shared libraries ++ */ ++ if (tpnt->libtype == elf_executable) ++ break; /* at this point all shared libs are initialized !! */ ++ ++ if (tpnt->init_flag & INIT_FUNCS_CALLED) ++ continue; ++ tpnt->init_flag |= INIT_FUNCS_CALLED; ++ ++ if (tpnt->dynamic_info[DT_INIT]) { ++ void (*dl_elf_func) (void); ++ dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]); ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file,"\ncalling init: %s\n\n", tpnt->libname); ++#endif ++ (*dl_elf_func) (); ++ } ++ if (_dl_atexit && tpnt->dynamic_info[DT_FINI]) { ++ void (*dl_elf_func) (void); ++ dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]); ++ (*_dl_atexit) (dl_elf_func); ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug && _dl_on_exit) ++ { ++ (*_dl_on_exit)(debug_fini, tpnt->libname); ++ } ++#endif ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ else { ++ if (!_dl_atexit) ++ _dl_dprintf(_dl_debug_file, "%s: The address of atexit () is 0x0.\n", tpnt->libname); ++#if 0 ++ if (!tpnt->dynamic_info[DT_FINI]) ++ _dl_dprintf(_dl_debug_file, "%s: Invalid .fini section.\n", tpnt->libname); ++#endif ++ } ++#endif ++ } ++} ++ ++/* ++ * This stub function is used by some debuggers. The idea is that they ++ * can set an internal breakpoint on it, so that we are notified when the ++ * address mapping is changed in some way. ++ */ ++void _dl_debug_state(void) ++{ ++} ++ ++char *_dl_getenv(const char *symbol, char **envp) ++{ ++ char *pnt; ++ const char *pnt1; ++ ++ while ((pnt = *envp++)) { ++ pnt1 = symbol; ++ while (*pnt && *pnt == *pnt1) ++ pnt1++, pnt++; ++ if (!*pnt || *pnt != '=' || *pnt1) ++ continue; ++ return pnt + 1; ++ } ++ return 0; ++} ++ ++void _dl_unsetenv(const char *symbol, char **envp) ++{ ++ char *pnt; ++ const char *pnt1; ++ char **newenvp = envp; ++ ++ for (pnt = *envp; pnt; pnt = *++envp) { ++ pnt1 = symbol; ++ while (*pnt && *pnt == *pnt1) ++ pnt1++, pnt++; ++ if (!*pnt || *pnt != '=' || *pnt1) ++ *newenvp++ = *envp; ++ } ++ *newenvp++ = *envp; ++ return; ++} ++ ++#include "hash.c" ++#include "readelflib1.c" +diff -urN uClibc/ldso-0.9.24/ldso/m68k/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/m68k/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/m68k/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/m68k/boot1_arch.h 2002-08-08 09:35:37.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. See arm/boot1_arch.h for an example of what ++ * can be done. ++ */ ++ ++#define LD_BOOT(X) void _dl_boot (X) +diff -urN uClibc/ldso-0.9.24/ldso/m68k/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/m68k/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/m68k/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/m68k/elfinterp.c 2002-11-05 12:21:04.000000000 -0600 +@@ -0,0 +1,359 @@ ++/* vi: set sw=4 ts=4: */ ++/* m68k ELF shared library loader suppport ++ * ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, ++ * David Engel, Hongjiu Lu and Mitch D'Souza ++ * Adapted to ELF/68k by Andreas Schwab. ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes[] = ++{ ++ "R_68K_NONE", ++ "R_68K_32", "R_68K_16", "R_68K_8", ++ "R_68K_PC32", "R_68K_PC16", "R_68K_PC8", ++ "R_68K_GOT32", "R_68K_GOT16", "R_68K_GOT8", ++ "R_68K_GOT32O", "R_68K_GOT16O", "R_68K_GOT8O", ++ "R_68K_PLT32", "R_68K_PLT16", "R_68K_PLT8", ++ "R_68K_PLT32O", "R_68K_PLT16O", "R_68K_PLT8O", ++ "R_68K_COPY", "R_68K_GLOB_DAT", "R_68K_JMP_SLOT", "R_68K_RELATIVE", ++ "R_68K_NUM" ++}; ++#endif ++ ++/* Program to load an ELF binary on a linux system, and run it. ++ References to symbols in sharable libraries can be resolved by either ++ an ELF sharable library or a linux style of shared library. */ ++ ++/* Disclaimer: I have never seen any AT&T source code for SVr4, nor have ++ I ever taken any courses on internals. This program was developed using ++ information available through the book "UNIX SYSTEM V RELEASE 4, ++ Programmers guide: Ansi C and Programming Support Tools", which did ++ a more than adequate job of explaining everything required to get this ++ working. */ ++ ++ ++unsigned int _dl_linux_resolver (int dummy1, int dummy2, ++ struct elf_resolve *tpnt, int reloc_entry) ++{ ++ int reloc_type; ++ Elf32_Rela *this_reloc; ++ char *strtab; ++ Elf32_Sym *symtab; ++ char *rel_addr; ++ int symtab_index; ++ char *new_addr; ++ char **got_addr; ++ unsigned int instr_addr; ++ ++ rel_addr = tpnt->loadaddr + tpnt->dynamic_info[DT_JMPREL]; ++ this_reloc = (Elf32_Rela *) (rel_addr + reloc_entry); ++ reloc_type = ELF32_R_TYPE (this_reloc->r_info); ++ symtab_index = ELF32_R_SYM (this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] ++ + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ ++ if (reloc_type != R_68K_JMP_SLOT) ++ { ++ _dl_dprintf (2, "%s: incorrect relocation type in jump relocations\n", ++ _dl_progname); ++ _dl_exit (1); ++ } ++ ++ /* Address of jump instruction to fix up. */ ++ instr_addr = (int) this_reloc->r_offset + (int) tpnt->loadaddr; ++ got_addr = (char **) instr_addr; ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if (_dl_debug_symbols) { ++ _dl_dprintf (2, "Resolving symbol %s\n", strtab + symtab[symtab_index].st_name); ++ } ++#endif ++ ++ /* Get the address of the GOT entry. */ ++ new_addr = _dl_find_hash (strtab + symtab[symtab_index].st_name, ++ tpnt->symbol_scope, tpnt, resolver); ++ if (!new_addr) ++ { ++ _dl_dprintf (2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ _dl_exit (1); ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if ((unsigned long) got_addr < 0x40000000) ++ { ++ if (_dl_debug_bindings) ++ { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", ++ strtab + symtab[symtab_index].st_name); ++ if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, ++ "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); ++ } ++ } ++ if (!_dl_debug_nofixups) { ++ *got_addr = new_addr; ++ } ++#else ++ *got_addr = new_addr; ++#endif ++ ++ return (unsigned int) new_addr; ++} ++ ++void ++_dl_parse_lazy_relocation_information (struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ int i; ++ char *strtab; ++ int reloc_type; ++ int symtab_index; ++ Elf32_Sym *symtab; ++ Elf32_Rela *rpnt; ++ unsigned int *reloc_addr; ++ ++ /* Now parse the relocation information. */ ++ rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof (Elf32_Rela); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] ++ + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) ++ { ++ reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE (rpnt->r_info); ++ symtab_index = ELF32_R_SYM (rpnt->r_info); ++ ++ /* When the dynamic linker bootstrapped itself, it resolved some symbols. ++ Make sure we do not do them again. */ ++ if (tpnt->libtype == program_interpreter ++ && (!symtab_index ++ || _dl_symbol (strtab + symtab[symtab_index].st_name))) ++ continue; ++ ++ switch (reloc_type) ++ { ++ case R_68K_NONE: ++ break; ++ case R_68K_JMP_SLOT: ++ *reloc_addr += (unsigned int) tpnt->loadaddr; ++ break; ++ default: ++ _dl_dprintf (2, "%s: (LAZY) can't handle reloc type ", _dl_progname); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf (2, "%s ", _dl_reltypes[reloc_type]); ++#endif ++ if (symtab_index) ++ _dl_dprintf (2, "'%s'", strtab + symtab[symtab_index].st_name); ++ _dl_dprintf (2, "\n"); ++ _dl_exit (1); ++ } ++ } ++} ++ ++int ++_dl_parse_relocation_information (struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ int i; ++ char *strtab; ++ int reloc_type; ++ int goof = 0; ++ Elf32_Sym *symtab; ++ Elf32_Rela *rpnt; ++ unsigned int *reloc_addr; ++ unsigned int symbol_addr; ++ int symtab_index; ++ /* Now parse the relocation information */ ++ ++ rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof (Elf32_Rela); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] ++ + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) ++ { ++ reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE (rpnt->r_info); ++ symtab_index = ELF32_R_SYM (rpnt->r_info); ++ symbol_addr = 0; ++ ++ if (tpnt->libtype == program_interpreter ++ && (!symtab_index ++ || _dl_symbol (strtab + symtab[symtab_index].st_name))) ++ continue; ++ ++ if (symtab_index) ++ { ++ symbol_addr = (unsigned int) ++ _dl_find_hash (strtab + symtab[symtab_index].st_name, ++ tpnt->symbol_scope, ++ reloc_type == R_68K_JMP_SLOT ? tpnt : NULL, symbolrel); ++ ++ /* We want to allow undefined references to weak symbols - ++ this might have been intentional. We should not be ++ linking local symbols here, so all bases should be ++ covered. */ ++ if (!symbol_addr ++ && ELF32_ST_BIND (symtab[symtab_index].st_info) == STB_GLOBAL) ++ { ++ _dl_dprintf (2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ goof++; ++ } ++ } ++ switch (reloc_type) ++ { ++ case R_68K_NONE: ++ break; ++ case R_68K_8: ++ *(char *) reloc_addr = symbol_addr + rpnt->r_addend; ++ break; ++ case R_68K_16: ++ *(short *) reloc_addr = symbol_addr + rpnt->r_addend; ++ break; ++ case R_68K_32: ++ *reloc_addr = symbol_addr + rpnt->r_addend; ++ break; ++ case R_68K_PC8: ++ *(char *) reloc_addr = (symbol_addr + rpnt->r_addend ++ - (unsigned int) reloc_addr); ++ break; ++ case R_68K_PC16: ++ *(short *) reloc_addr = (symbol_addr + rpnt->r_addend ++ - (unsigned int) reloc_addr); ++ break; ++ case R_68K_PC32: ++ *reloc_addr = (symbol_addr + rpnt->r_addend ++ - (unsigned int) reloc_addr); ++ break; ++ case R_68K_GLOB_DAT: ++ case R_68K_JMP_SLOT: ++ *reloc_addr = symbol_addr; ++ break; ++ case R_68K_RELATIVE: ++ *reloc_addr = ((unsigned int) tpnt->loadaddr ++ /* Compatibility kludge. */ ++ + (rpnt->r_addend ? : *reloc_addr)); ++ break; ++ case R_68K_COPY: ++#if 0 /* Do this later. */ ++ _dl_dprintf (2, "Doing copy"); ++ if (symtab_index) ++ _dl_dprintf (2, " for symbol %s", ++ strtab + symtab[symtab_index].st_name); ++ _dl_dprintf (2, "\n"); ++ _dl_memcpy ((void *) symtab[symtab_index].st_value, ++ (void *) symbol_addr, ++ symtab[symtab_index].st_size); ++#endif ++ break; ++ default: ++ _dl_dprintf (2, "%s: can't handle reloc type ", _dl_progname); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf (2, "%s ", _dl_reltypes[reloc_type]); ++#endif ++ if (symtab_index) ++ _dl_dprintf (2, "'%s'", strtab + symtab[symtab_index].st_name); ++ _dl_dprintf (2, "\n"); ++ _dl_exit (1); ++ } ++ ++ } ++ return goof; ++} ++ ++/* This is done as a separate step, because there are cases where ++ information is first copied and later initialized. This results in ++ the wrong information being copied. Someone at Sun was complaining about ++ a bug in the handling of _COPY by SVr4, and this may in fact be what he ++ was talking about. Sigh. */ ++ ++/* No, there are cases where the SVr4 linker fails to emit COPY relocs ++ at all. */ ++ ++int ++_dl_parse_copy_information (struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ int i; ++ char *strtab; ++ int reloc_type; ++ int goof = 0; ++ Elf32_Sym *symtab; ++ Elf32_Rela *rpnt; ++ unsigned int *reloc_addr; ++ unsigned int symbol_addr; ++ struct elf_resolve *tpnt; ++ int symtab_index; ++ /* Now parse the relocation information */ ++ ++ tpnt = xpnt->dyn; ++ ++ rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof (Elf32_Rela); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] ++ + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) ++ { ++ reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE (rpnt->r_info); ++ if (reloc_type != R_68K_COPY) ++ continue; ++ symtab_index = ELF32_R_SYM (rpnt->r_info); ++ symbol_addr = 0; ++ if (tpnt->libtype == program_interpreter ++ && (!symtab_index ++ || _dl_symbol (strtab + symtab[symtab_index].st_name))) ++ continue; ++ if (symtab_index) ++ { ++ symbol_addr = (unsigned int) ++ _dl_find_hash (strtab + symtab[symtab_index].st_name, ++ xpnt->next, NULL, copyrel); ++ if (!symbol_addr) ++ { ++ _dl_dprintf (2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ goof++; ++ } ++ } ++ if (!goof) ++ _dl_memcpy ((void *) symtab[symtab_index].st_value, (void *) symbol_addr, ++ symtab[symtab_index].st_size); ++ } ++ return goof; ++} +diff -urN uClibc/ldso-0.9.24/ldso/m68k/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/m68k/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/m68k/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/m68k/ld_syscalls.h 2002-03-19 04:43:32.000000000 -0600 +@@ -0,0 +1,174 @@ ++/* ++ * This file contains the system call macros and syscall ++ * numbers used by the shared library loader. ++ */ ++ ++#define __NR_exit 1 ++#define __NR_read 3 ++#define __NR_write 4 ++#define __NR_open 5 ++#define __NR_close 6 ++#define __NR_getuid 24 ++#define __NR_geteuid 49 ++#define __NR_getgid 47 ++#define __NR_getegid 50 ++#define __NR_readlink 85 ++#define __NR_mmap 90 ++#define __NR_munmap 91 ++#define __NR_stat 106 ++#define __NR_mprotect 125 ++ ++ ++/* Here are the macros which define how this platform makes ++ * system calls. This particular variant does _not_ set ++ * errno (note how it is disabled in __syscall_return) since ++ * these will get called before the errno symbol is dynamicly ++ * linked. */ ++ ++ ++#define __syscall_return(type, res) \ ++do { \ ++ if ((unsigned long)(res) >= (unsigned long)(-125)) { \ ++ /* avoid using res which is declared to be in register d0; \ ++ errno might expand to a function call and clobber it. */ \ ++ /* int __err = -(res); \ ++ errno = __err; */ \ ++ res = -1; \ ++ } \ ++ return (type) (res); \ ++} while (0) ++ ++#define _syscall0(type, name) \ ++type name(void) \ ++{ \ ++ long __res; \ ++ __asm__ __volatile__ ("movel %1, %%d0\n\t" \ ++ "trap #0\n\t" \ ++ "movel %%d0, %0" \ ++ : "=g" (__res) \ ++ : "i" (__NR_##name) \ ++ : "cc", "%d0"); \ ++ if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ ++ /* errno = -__res; */ \ ++ __res = -1; \ ++ } \ ++ return (type)__res; \ ++} ++ ++#define _syscall1(type, name, atype, a) \ ++type name(atype a) \ ++{ \ ++ long __res; \ ++ __asm__ __volatile__ ("movel %2, %%d1\n\t" \ ++ "movel %1, %%d0\n\t" \ ++ "trap #0\n\t" \ ++ "movel %%d0, %0" \ ++ : "=g" (__res) \ ++ : "i" (__NR_##name), \ ++ "g" ((long)a) \ ++ : "cc", "%d0", "%d1"); \ ++ if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ ++ /* errno = -__res; */ \ ++ __res = -1; \ ++ } \ ++ return (type)__res; \ ++} ++ ++#define _syscall2(type, name, atype, a, btype, b) \ ++type name(atype a, btype b) \ ++{ \ ++ long __res; \ ++ __asm__ __volatile__ ("movel %3, %%d2\n\t" \ ++ "movel %2, %%d1\n\t" \ ++ "movel %1, %%d0\n\t" \ ++ "trap #0\n\t" \ ++ "movel %%d0, %0" \ ++ : "=g" (__res) \ ++ : "i" (__NR_##name), \ ++ "a" ((long)a), \ ++ "g" ((long)b) \ ++ : "cc", "%d0", "%d1", "%d2"); \ ++ if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ ++ /* errno = -__res; */ \ ++ __res = -1; \ ++ } \ ++ return (type)__res; \ ++} ++ ++#define _syscall3(type, name, atype, a, btype, b, ctype, c) \ ++type name(atype a, btype b, ctype c) \ ++{ \ ++ long __res; \ ++ __asm__ __volatile__ ("movel %4, %%d3\n\t" \ ++ "movel %3, %%d2\n\t" \ ++ "movel %2, %%d1\n\t" \ ++ "movel %1, %%d0\n\t" \ ++ "trap #0\n\t" \ ++ "movel %%d0, %0" \ ++ : "=g" (__res) \ ++ : "i" (__NR_##name), \ ++ "a" ((long)a), \ ++ "a" ((long)b), \ ++ "g" ((long)c) \ ++ : "cc", "%d0", "%d1", "%d2", "%d3"); \ ++ if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ ++ /* errno = -__res; */ \ ++ __res = -1; \ ++ } \ ++ return (type)__res; \ ++} ++ ++#define _syscall4(type, name, atype, a, btype, b, ctype, c, dtype, d) \ ++type name(atype a, btype b, ctype c, dtype d) \ ++{ \ ++ long __res; \ ++ __asm__ __volatile__ ("movel %5, %%d4\n\t" \ ++ "movel %4, %%d3\n\t" \ ++ "movel %3, %%d2\n\t" \ ++ "movel %2, %%d1\n\t" \ ++ "movel %1, %%d0\n\t" \ ++ "trap #0\n\t" \ ++ "movel %%d0, %0" \ ++ : "=g" (__res) \ ++ : "i" (__NR_##name), \ ++ "a" ((long)a), \ ++ "a" ((long)b), \ ++ "a" ((long)c), \ ++ "g" ((long)d) \ ++ : "cc", "%d0", "%d1", "%d2", "%d3", \ ++ "%d4"); \ ++ if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ ++ /* errno = -__res; */ \ ++ __res = -1; \ ++ } \ ++ return (type)__res; \ ++} ++ ++#define _syscall5(type, name, atype, a, btype, b, ctype, c, dtype, d, etype, e)\ ++type name(atype a, btype b, ctype c, dtype d, etype e) \ ++{ \ ++ long __res; \ ++ __asm__ __volatile__ ("movel %6, %%d5\n\t" \ ++ "movel %5, %%d4\n\t" \ ++ "movel %4, %%d3\n\t" \ ++ "movel %3, %%d2\n\t" \ ++ "movel %2, %%d1\n\t" \ ++ "movel %1, %%d0\n\t" \ ++ "trap #0\n\t" \ ++ "movel %%d0, %0" \ ++ : "=g" (__res) \ ++ : "i" (__NR_##name), \ ++ "a" ((long)a), \ ++ "a" ((long)b), \ ++ "a" ((long)c), \ ++ "a" ((long)d), \ ++ "g" ((long)e) \ ++ : "cc", "%d0", "%d1", "%d2", "%d3", \ ++ "%d4", "%d5"); \ ++ if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ ++ /* errno = -__res; */ \ ++ __res = -1; \ ++ } \ ++ return (type)__res; \ ++} ++ +diff -urN uClibc/ldso-0.9.24/ldso/m68k/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/m68k/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/m68k/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/m68k/ld_sysdep.h 2002-05-28 16:33:34.000000000 -0500 +@@ -0,0 +1,88 @@ ++ ++/* Various assmbly language/system dependent hacks that are required ++ so that we can minimize the amount of platform specific code. */ ++ ++/* Define this if the system uses RELOCA. */ ++#define ELF_USES_RELOCA ++ ++/* Get a pointer to the argv array. On many platforms this can be ++ just the address if the first argument, on other platforms we need ++ to do something a little more subtle here. */ ++#define GET_ARGV(ARGVP, ARGS) ((ARGVP) = ((unsigned int *) &(ARGS))) ++ ++/* Initialization sequence for a GOT. */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++{ \ ++ GOT_BASE[2] = (int) _dl_linux_resolve; \ ++ GOT_BASE[1] = (int) (MODULE); \ ++} ++ ++/* Here is a macro to perform a relocation. This is only used when ++ bootstrapping the dynamic loader. RELP is the relocation that we ++ are performing, REL is the pointer to the address we are ++ relocating. SYMBOL is the symbol involved in the relocation, and ++ LOAD is the load address. */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ switch (ELF32_R_TYPE ((RELP)->r_info)) \ ++ { \ ++ case R_68K_8: \ ++ *(char *) (REL) = (SYMBOL) + (RELP)->r_addend; \ ++ break; \ ++ case R_68K_16: \ ++ *(short *) (REL) = (SYMBOL) + (RELP)->r_addend; \ ++ break; \ ++ case R_68K_32: \ ++ *(REL) = (SYMBOL) + (RELP)->r_addend; \ ++ break; \ ++ case R_68K_PC8: \ ++ *(char *) (REL) = ((SYMBOL) + (RELP)->r_addend \ ++ - (unsigned int) (REL)); \ ++ break; \ ++ case R_68K_PC16: \ ++ *(short *) (REL) = ((SYMBOL) + (RELP)->r_addend \ ++ - (unsigned int) (REL)); \ ++ break; \ ++ case R_68K_PC32: \ ++ *(REL) = ((SYMBOL) + (RELP)->r_addend \ ++ - (unsigned int) (REL)); \ ++ break; \ ++ case R_68K_GLOB_DAT: \ ++ case R_68K_JMP_SLOT: \ ++ *(REL) = (SYMBOL); \ ++ break; \ ++ case R_68K_RELATIVE: /* Compatibility kludge */ \ ++ *(REL) = ((unsigned int) (LOAD) + ((RELP)->r_addend ? : *(REL))); \ ++ break; \ ++ default: \ ++ _dl_exit (1); \ ++ } ++ ++ ++/* Transfer control to the user's application, once the dynamic loader ++ is done. */ ++ ++#define START() \ ++ __asm__ volatile ("unlk %%a6\n\t" \ ++ "jmp %0@" \ ++ : : "a" (_dl_elf_main)); ++ ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++ ++#define MAGIC1 EM_68K ++#undef MAGIC2 ++/* Used for error messages */ ++#define ELF_TARGET "m68k" ++ ++struct elf_resolve; ++extern unsigned int _dl_linux_resolver (int, int, struct elf_resolve *, int); ++ ++/* Define this because we do not want to call .udiv in the library. ++ Not needed for m68k. */ ++#define do_rem(result, n, base) ((result) = (n) % (base)) ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/m68k/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/m68k/resolve.S +--- uClibc/ldso-0.9.24/ldso/m68k/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/m68k/resolve.S 2001-04-27 12:23:26.000000000 -0500 +@@ -0,0 +1,21 @@ ++/* ++ * These are various helper routines that are needed to run an ELF image. ++ */ ++ ++.text ++.even ++ ++.globl _dl_linux_resolve ++ .type _dl_linux_resolve,@function ++_dl_linux_resolve: ++ moveml %a0/%a1,%sp@- ++#ifdef __PIC__ ++ bsrl _dl_linux_resolver@PLTPC ++#else ++ jbsr _dl_linux_resolver ++#endif ++ moveml %sp@+,%a0/%a1 ++ addql #8,%sp ++ jmp @(%d0) ++.LFE2: ++ .size _dl_linux_resolve,.LFE2-_dl_linux_resolve +diff -urN uClibc/ldso-0.9.24/ldso/mips/README uClibc.ldso.24/ldso-0.9.24/ldso/mips/README +--- uClibc/ldso-0.9.24/ldso/mips/README 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/mips/README 2002-07-25 16:15:59.000000000 -0500 +@@ -0,0 +1,52 @@ ++Almost all of the code present in these source files was taken ++from GLIBC. In the descriptions below, all files mentioned are ++with respect to the top level GLIBC source directory accept for ++code taken from the Linux kernel. ++ ++boot1_arch.h ++------------ ++Contains code to fix up the stack pointer so that the dynamic ++linker can find argc, argv and Auxillary Vector Table (AVT). ++The code is taken from the function 'RTLD_START' in the file ++'sysdeps/mips/dl-machine.h'. ++ ++elfinterp.c ++----------- ++Contains the runtime resolver code taken from the function ++'__dl_runtime_resolve' in 'sysdeps/mips/dl-machine.h'. Also ++contains the function to perform relocations for objects ++other than the linker itself. The code was taken from the ++function 'elf_machine_rel' in 'sysdeps/mips/dl-machine.h'. ++ ++ld_syscalls.h ++------------- ++Used to contain all the macro functions for the system calls ++as well as the list of system calls supported. We now include ++ but with the __set_errno macro defined empty ++so we can use the same file for the linker as well as userspace. ++Original code was taken from the Linux kernel source 2.4.17 and ++can be found in the file 'include/asm-mips/unistd.h'. ++ ++ld_sysdep.h ++----------- ++Contains bootstrap code for the dynamic linker, magic numbers ++for detecting MIPS target types and some macros. The macro ++function 'PERFORM_BOOTSTRAP_GOT' is used to relocate the dynamic ++linker's GOT so that function calls can be made. The code is ++taken from the function 'ELF_MACHINE_BEFORE_RTLD_RELOC' in the ++file 'sysdeps/mips/dl-machine.h'. The other macro function ++'PERFORM_BOOTSTRAP_RELOC' is used to do the relocations for ++the dynamic loader. The code is taken from the function ++'elf_machine_rel' in the file 'sysdeps/mips/dl-machine.h'. The ++final macro function is 'INIT_GOT' which initializes the GOT ++for the application being dynamically linked and loaded. The ++code is taken from the functions 'elf_machine_runtime_setup' ++and 'elf_machine_got_rel' in 'sysdeps/mips/dl-machine.h'. ++ ++resolve.S ++--------- ++Contains the low-level assembly code for the dynamic runtime ++resolver. The code is taken from the assembly code function ++'_dl_runtime_resolve' in the file 'sysdeps/mips/dl-machine.h'. ++The code looks a bit different since we only need to pass the ++symbol index and the old GP register. +diff -urN uClibc/ldso-0.9.24/ldso/mips/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/mips/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/mips/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/mips/boot1_arch.h 2003-06-12 16:39:10.000000000 -0500 +@@ -0,0 +1,38 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. ++ */ ++ ++asm("" \ ++" .text\n" \ ++" .globl _dl_boot\n" \ ++"_dl_boot:\n" \ ++" .set noreorder\n" \ ++" bltzal $0, 0f\n" \ ++" nop\n" \ ++"0: .cpload $31\n" \ ++" .set reorder\n" \ ++" la $4, _DYNAMIC\n" \ ++" sw $4, -0x7ff0($28)\n" \ ++" move $4, $29\n" \ ++" la $8, coff\n" \ ++" .set noreorder\n" \ ++" bltzal $0, coff\n" \ ++" nop\n" \ ++"coff: subu $8, $31, $8\n" \ ++" .set reorder\n" \ ++" la $25, _dl_boot2\n" \ ++" addu $25, $8\n" \ ++" jalr $25\n" \ ++" lw $4, 0($29)\n" \ ++" la $5, 4($29)\n" \ ++" sll $6, $4, 2\n" \ ++" addu $6, $6, $5\n" \ ++" addu $6, $6, 4\n" \ ++" la $7, _dl_elf_main\n" \ ++" lw $25, 0($7)\n" \ ++" jr $25\n" \ ++); ++ ++#define _dl_boot _dl_boot2 ++#define LD_BOOT(X) static void __attribute__ ((unused)) _dl_boot (X) +diff -urN uClibc/ldso-0.9.24/ldso/mips/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/mips/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/mips/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/mips/elfinterp.c 2003-08-22 02:04:16.000000000 -0500 +@@ -0,0 +1,301 @@ ++/* vi: set sw=4 ts=4: */ ++/* mips/mipsel ELF shared library loader suppport ++ * ++ Copyright (C) 2002, Steven J. Hill (sjhill@realitydiluted.com) ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes_tab[] = ++{ ++ [0] "R_MIPS_NONE", "R_MIPS_16", "R_MIPS_32", ++ [3] "R_MIPS_REL32", "R_MIPS_26", "R_MIPS_HI16", ++ [6] "R_MIPS_LO16", "R_MIPS_GPREL16", "R_MIPS_LITERAL", ++ [9] "R_MIPS_GOT16", "R_MIPS_PC16", "R_MIPS_CALL16", ++ [12] "R_MIPS_GPREL32", ++ [16] "R_MIPS_SHIFT5", "R_MIPS_SHIFT6", "R_MIPS_64", ++ [19] "R_MIPS_GOT_DISP", "R_MIPS_GOT_PAGE", "R_MIPS_GOT_OFST", ++ [22] "R_MIPS_GOT_HI16", "R_MIPS_GOT_LO16", "R_MIPS_SUB", ++ [25] "R_MIPS_INSERT_A", "R_MIPS_INSERT_B", "R_MIPS_DELETE", ++ [28] "R_MIPS_HIGHER", "R_MIPS_HIGHEST", "R_MIPS_CALL_HI16", ++ [31] "R_MIPS_CALL_LO16", "R_MIPS_SCN_DISP", "R_MIPS_REL16", ++ [34] "R_MIPS_ADD_IMMEDIATE", "R_MIPS_PJUMP", "R_MIPS_RELGOT", ++ [37] "R_MIPS_JALR", ++}; ++ ++static const char * ++_dl_reltypes(int type) ++{ ++ static char buf[22]; ++ const char *str; ++ ++ if (type >= (int)(sizeof (_dl_reltypes_tab)/sizeof(_dl_reltypes_tab[0])) || ++ NULL == (str = _dl_reltypes_tab[type])) ++ { ++ str =_dl_simple_ltoa( buf, (unsigned long)(type)); ++ } ++ return str; ++} ++ ++static ++void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index) ++{ ++ if(_dl_debug_symbols) ++ { ++ if(symtab_index){ ++ _dl_dprintf(_dl_debug_file, "\n%s\n\tvalue=%x\tsize=%x\tinfo=%x\tother=%x\tshndx=%x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_value, ++ symtab[symtab_index].st_size, ++ symtab[symtab_index].st_info, ++ symtab[symtab_index].st_other, ++ symtab[symtab_index].st_shndx); ++ } ++ } ++} ++ ++static void debug_reloc(Elf32_Sym *symtab,char *strtab, ELF_RELOC *rpnt) ++{ ++ if(_dl_debug_reloc) ++ { ++ int symtab_index; ++ const char *sym; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ sym = symtab_index ? strtab + symtab[symtab_index].st_name : "sym=0x0"; ++ ++ if(_dl_debug_symbols) ++ _dl_dprintf(_dl_debug_file, "\n\t"); ++ else ++ _dl_dprintf(_dl_debug_file, "\n%s\n\t", sym); ++#ifdef ELF_USES_RELOCA ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\taddend=%x", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ rpnt->r_addend); ++#else ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\n", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset); ++#endif ++ } ++} ++#endif ++ ++extern int _dl_linux_resolve(void); ++ ++#define OFFSET_GP_GOT 0x7ff0 ++ ++unsigned long _dl_linux_resolver(unsigned long sym_index, ++ unsigned long old_gpreg) ++{ ++ unsigned long *got = (unsigned long *) (old_gpreg - OFFSET_GP_GOT); ++ struct elf_resolve *tpnt = (struct elf_resolve *) got[1]; ++ Elf32_Sym *sym; ++ char *strtab; ++ unsigned long local_gotno; ++ unsigned long gotsym; ++ unsigned long new_addr; ++ unsigned long instr_addr; ++ char **got_addr; ++ char *symname; ++ ++ gotsym = tpnt->mips_gotsym; ++ local_gotno = tpnt->mips_local_gotno; ++ ++ sym = ((Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr)) + sym_index; ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ symname = strtab + sym->st_name; ++ ++ new_addr = (unsigned long) _dl_find_hash(strtab + sym->st_name, ++ tpnt->symbol_scope, tpnt, resolver); ++ ++ /* Address of jump instruction to fix up */ ++ instr_addr = (unsigned long) (got + local_gotno + sym_index - gotsym); ++ got_addr = (char **) instr_addr; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if (_dl_debug_bindings) ++ { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname); ++ if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, ++ "\n\tpatched %x ==> %x @ %x\n", *got_addr, new_addr, got_addr); ++ } ++ if (!_dl_debug_nofixups) { ++ *got_addr = (char*)new_addr; ++ } ++#else ++ *got_addr = (char*)new_addr; ++#endif ++ ++ return new_addr; ++} ++ ++void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ /* Nothing to do */ ++ return; ++} ++ ++int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ /* Nothing to do */ ++ return 0; ++} ++ ++ ++int _dl_parse_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ Elf32_Sym *symtab; ++ Elf32_Rel *rpnt; ++ char *strtab; ++ unsigned long *got; ++ unsigned long *reloc_addr=NULL, old_val=0; ++ unsigned long symbol_addr; ++ int i, reloc_type, symtab_index; ++ ++ /* Now parse the relocation information */ ++ rel_size = rel_size / sizeof(Elf32_Rel); ++ rpnt = (Elf32_Rel *) (rel_addr + tpnt->loadaddr); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ got = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) { ++ reloc_addr = (unsigned long *) (tpnt->loadaddr + ++ (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ ++ if (!symtab_index && tpnt->libtype == program_interpreter) ++ continue; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab,strtab,symtab_index); ++ debug_reloc(symtab,strtab,rpnt); ++ old_val = *reloc_addr; ++#endif ++ ++ switch (reloc_type) { ++ case R_MIPS_REL32: ++ if (symtab_index) { ++ if (symtab_index < tpnt->mips_gotsym) ++ *reloc_addr += ++ symtab[symtab_index].st_value + ++ (unsigned long) tpnt->loadaddr; ++ else { ++ *reloc_addr += got[symtab_index + tpnt->mips_local_gotno - ++ tpnt->mips_gotsym]; ++ } ++ } ++ else { ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ } ++ break; ++ case R_MIPS_NONE: ++ break; ++ default: ++ { ++ int reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ _dl_dprintf(2, "\n%s: ",_dl_progname); ++ ++ if (symtab_index) ++ _dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); ++#else ++ _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); ++#endif ++ _dl_exit(1); ++ } ++ }; ++ ++ }; ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x\n", old_val, *reloc_addr, reloc_addr); ++#endif ++ ++ return 0; ++} ++ ++void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt) ++{ ++ Elf32_Sym *sym; ++ char *strtab; ++ unsigned long i; ++ unsigned long *got_entry; ++ ++ for (; tpnt ; tpnt = tpnt->next) { ++ ++ /* We don't touch the dynamic linker */ ++ if (tpnt->libtype == program_interpreter) ++ continue; ++ ++ /* Setup the loop variables */ ++ got_entry = (unsigned long *) (tpnt->loadaddr + ++ tpnt->dynamic_info[DT_PLTGOT]) + tpnt->mips_local_gotno; ++ sym = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + ++ (unsigned long) tpnt->loadaddr) + tpnt->mips_gotsym; ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + ++ (unsigned long) tpnt->loadaddr); ++ i = tpnt->mips_symtabno - tpnt->mips_gotsym; ++ ++ /* Relocate the global GOT entries for the object */ ++ while(i--) { ++ if (sym->st_shndx == SHN_UNDEF) { ++ if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && sym->st_value) ++ *got_entry = sym->st_value + (unsigned long) tpnt->loadaddr; ++ else { ++ *got_entry = (unsigned long) _dl_find_hash(strtab + ++ sym->st_name, tpnt->symbol_scope, NULL, copyrel); ++ } ++ } ++ else if (sym->st_shndx == SHN_COMMON) { ++ *got_entry = (unsigned long) _dl_find_hash(strtab + ++ sym->st_name, tpnt->symbol_scope, NULL, copyrel); ++ } ++ else if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && ++ *got_entry != sym->st_value) ++ *got_entry += (unsigned long) tpnt->loadaddr; ++ else if (ELF32_ST_TYPE(sym->st_info) == STT_SECTION) { ++ if (sym->st_other == 0) ++ *got_entry += (unsigned long) tpnt->loadaddr; ++ } ++ else { ++ *got_entry = (unsigned long) _dl_find_hash(strtab + ++ sym->st_name, tpnt->symbol_scope, NULL, copyrel); ++ } ++ ++ got_entry++; ++ sym++; ++ } ++ } ++} +diff -urN uClibc/ldso-0.9.24/ldso/mips/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/mips/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/mips/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/mips/ld_syscalls.h 2002-08-09 07:20:20.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* Define the __set_errno macro as nothing so that we don't bother ++ * setting errno, which is important since we make system calls ++ * before the errno symbol is dynamicly linked. */ ++ ++#define __set_errno(X) {(void)(X);} ++#include "sys/syscall.h" ++ +diff -urN uClibc/ldso-0.9.24/ldso/mips/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/mips/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/mips/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/mips/ld_sysdep.h 2002-05-28 16:33:36.000000000 -0500 +@@ -0,0 +1,136 @@ ++/* vi: set sw=4 ts=4: */ ++ ++/* ++ * Various assmbly language/system dependent hacks that are required ++ * so that we can minimize the amount of platform specific code. ++ */ ++ ++/* ++ * Define this if the system uses RELOCA. ++ */ ++#undef ELF_USES_RELOCA ++ ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long *) ARGS) ++ ++ ++/* ++ * Initialization sequence for the application/library GOT. ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++do { \ ++ unsigned long i; \ ++ \ ++ /* Check if this is the dynamic linker itself */ \ ++ if (MODULE->libtype == program_interpreter) \ ++ continue; \ ++ \ ++ /* Fill in first two GOT entries according to the ABI */ \ ++ GOT_BASE[0] = (unsigned long) _dl_linux_resolve; \ ++ GOT_BASE[1] = (unsigned long) MODULE; \ ++ \ ++ /* Add load address displacement to all local GOT entries */ \ ++ i = 2; \ ++ while (i < MODULE->mips_local_gotno) \ ++ GOT_BASE[i++] += (unsigned long) MODULE->loadaddr; \ ++ \ ++} while (0) ++ ++ ++/* ++ * Here is a macro to perform the GOT relocation. This is only ++ * used when bootstrapping the dynamic loader. ++ */ ++#define PERFORM_BOOTSTRAP_GOT(got) \ ++do { \ ++ Elf32_Sym *sym; \ ++ unsigned long i; \ ++ \ ++ /* Add load address displacement to all local GOT entries */ \ ++ i = 2; \ ++ while (i < tpnt->mips_local_gotno) \ ++ got[i++] += load_addr; \ ++ \ ++ /* Handle global GOT entries */ \ ++ got += tpnt->mips_local_gotno; \ ++ sym = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + \ ++ load_addr) + tpnt->mips_gotsym; \ ++ i = tpnt->mips_symtabno - tpnt->mips_gotsym; \ ++ \ ++ while (i--) { \ ++ if (sym->st_shndx == SHN_UNDEF || \ ++ sym->st_shndx == SHN_COMMON) \ ++ *got = load_addr + sym->st_value; \ ++ else if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && \ ++ *got != sym->st_value) \ ++ *got += load_addr; \ ++ else if (ELF32_ST_TYPE(sym->st_info) == STT_SECTION) { \ ++ if (sym->st_other == 0) \ ++ *got += load_addr; \ ++ } \ ++ else \ ++ *got = load_addr + sym->st_value; \ ++ \ ++ got++; \ ++ sym++; \ ++ } \ ++} while (0) ++ ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. ++ */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ switch(ELF32_R_TYPE((RELP)->r_info)) { \ ++ case R_MIPS_REL32: \ ++ if (symtab_index) { \ ++ if (symtab_index < tpnt->mips_gotsym) \ ++ *REL += SYMBOL; \ ++ } \ ++ else { \ ++ *REL += LOAD; \ ++ } \ ++ break; \ ++ case R_MIPS_NONE: \ ++ break; \ ++ default: \ ++ SEND_STDERR("Aiieeee!"); \ ++ _dl_exit(1); \ ++ } ++ ++ ++/* ++ * Transfer control to the user's application, once the dynamic loader ++ * is done. This routine has to exit the current function, then ++ * call the _dl_elf_main function. For MIPS, we do it in assembly ++ * because the stack doesn't get properly restored otherwise. Got look ++ * at boot1_arch.h ++ */ ++#define START() ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++#define MAGIC1 EM_MIPS ++#define MAGIC2 EM_MIPS_RS3_LE ++ ++ ++/* Used for error messages */ ++#define ELF_TARGET "MIPS" ++ ++ ++unsigned long _dl_linux_resolver(unsigned long sym_index, ++ unsigned long old_gpreg); ++ ++ ++#define do_rem(result, n, base) result = (n % base) ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/mips/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/mips/resolve.S +--- uClibc/ldso-0.9.24/ldso/mips/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/mips/resolve.S 2003-01-30 10:40:26.000000000 -0600 +@@ -0,0 +1,45 @@ ++ /* ++ * Linux dynamic resolving code for MIPS. Fixes up the GOT entry as ++ * indicated in register t8 and jumps to the resolved address. Shamelessly ++ * ripped from 'sysdeps/mips/dl-machine.h' in glibc-2.2.5. ++ * ++ * This file is subject to the terms and conditions of the GNU Lesser General ++ * Public License. See the file "COPYING.LIB" in the main directory of this ++ * archive for more details. ++ * ++ * Copyright (C) 1996-2001 Kazumoto Kojima ++ * Copyright (C) 2002 Steven J. Hill ++ * ++ */ ++.text ++.align 2 ++.globl _dl_linux_resolve ++.type _dl_linux_resolve,@function ++.ent _dl_linux_resolve ++_dl_linux_resolve: ++ .frame $29, 40, $31 ++ .set noreorder ++ move $3, $28 # Save GP ++ addu $25, 8 # t9 ($25) now points at .cpload instruction ++ .cpload $25 # Compute GP ++ .set reorder ++ subu $29, 40 ++ .cprestore 32 ++ sw $15, 36($29) ++ sw $4, 16($29) ++ sw $5, 20($29) ++ sw $6, 24($29) ++ sw $7, 28($29) ++ move $4, $24 ++ move $5, $3 ++ jal _dl_linux_resolver ++ lw $31, 36($29) ++ lw $4, 16($29) ++ lw $5, 20($29) ++ lw $6, 24($29) ++ lw $7, 28($29) ++ addu $29, 40 ++ move $25, $2 ++ jr $25 ++.size _dl_linux_resolve,.-_dl_linux_resolve ++.end _dl_linux_resolve +diff -urN uClibc/ldso-0.9.24/ldso/powerpc/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/powerpc/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/boot1_arch.h 2003-02-15 19:22:41.000000000 -0600 +@@ -0,0 +1,20 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. */ ++ ++/* Overrive the default _dl_boot function, and replace it with a bit of asm. ++ * Then call the real _dl_boot function, which is now named _dl_boot2. */ ++ ++asm("" \ ++" .text\n" \ ++" .globl _dl_boot\n" \ ++"_dl_boot:\n" \ ++" mr 3,1\n" \ ++" addi 1,1,-16\n" \ ++" bl _dl_boot2\n" \ ++".previous\n" \ ++); ++ ++#define _dl_boot _dl_boot2 ++#define LD_BOOT(X) static void * __attribute__ ((unused)) _dl_boot (X) ++ +diff -urN uClibc/ldso-0.9.24/ldso/powerpc/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/powerpc/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/elfinterp.c 2003-12-03 17:28:33.000000000 -0600 +@@ -0,0 +1,621 @@ ++/* vi: set sw=4 ts=4: */ ++/* powerpc shared library loader suppport ++ * ++ * Copyright (C) 2001-2002, David A. Schleef ++ * Copyright (C) 2003, Erik Andersen ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes_tab[] = ++ { "R_PPC_NONE", "R_PPC_ADDR32", "R_PPC_ADDR24", "R_PPC_ADDR16", ++ "R_PPC_ADDR16_LO", "R_PPC_ADDR16_HI", "R_PPC_ADDR16_HA", ++ "R_PPC_ADDR14", "R_PPC_ADDR14_BRTAKEN", "R_PPC_ADDR14_BRNTAKEN", ++ "R_PPC_REL24", "R_PPC_REL14", "R_PPC_REL14_BRTAKEN", ++ "R_PPC_REL14_BRNTAKEN", "R_PPC_GOT16", "R_PPC_GOT16_LO", ++ "R_PPC_GOT16_HI", "R_PPC_GOT16_HA", "R_PPC_PLTREL24", ++ "R_PPC_COPY", "R_PPC_GLOB_DAT", "R_PPC_JMP_SLOT", "R_PPC_RELATIVE", ++ "R_PPC_LOCAL24PC", "R_PPC_UADDR32", "R_PPC_UADDR16", "R_PPC_REL32", ++ "R_PPC_PLT32", "R_PPC_PLTREL32", "R_PPC_PLT16_LO", "R_PPC_PLT16_HI", ++ "R_PPC_PLT16_HA", "R_PPC_SDAREL16", "R_PPC_SECTOFF", ++ "R_PPC_SECTOFF_LO", "R_PPC_SECTOFF_HI", "R_PPC_SECTOFF_HA", ++}; ++ ++static const char * ++_dl_reltypes(int type) ++{ ++ static char buf[22]; ++ const char *str; ++ ++ if (type >= (int)(sizeof (_dl_reltypes_tab)/sizeof(_dl_reltypes_tab[0])) || ++ NULL == (str = _dl_reltypes_tab[type])) ++ { ++ str =_dl_simple_ltoa( buf, (unsigned long)(type)); ++ } ++ return str; ++} ++ ++static ++void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index) ++{ ++ if(_dl_debug_symbols) ++ { ++ if(symtab_index){ ++ _dl_dprintf(_dl_debug_file, "\n%s\n\tvalue=%x\tsize=%x\tinfo=%x\tother=%x\tshndx=%x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_value, ++ symtab[symtab_index].st_size, ++ symtab[symtab_index].st_info, ++ symtab[symtab_index].st_other, ++ symtab[symtab_index].st_shndx); ++ } ++ } ++} ++ ++static ++void debug_reloc(Elf32_Sym *symtab,char *strtab, ELF_RELOC *rpnt) ++{ ++ if(_dl_debug_reloc) ++ { ++ int symtab_index; ++ const char *sym; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ sym = symtab_index ? strtab + symtab[symtab_index].st_name : "sym=0x0"; ++ ++ if(_dl_debug_symbols) ++ _dl_dprintf(_dl_debug_file, "\n\t"); ++ else ++ _dl_dprintf(_dl_debug_file, "\n%s\n\t", sym); ++#ifdef ELF_USES_RELOCA ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\taddend=%x", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ rpnt->r_addend); ++#else ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\n", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset); ++#endif ++ } ++} ++#endif ++ ++extern int _dl_linux_resolve(void); ++ ++void _dl_init_got(unsigned long *plt,struct elf_resolve *tpnt) ++{ ++ unsigned long target_addr = (unsigned long)_dl_linux_resolve; ++ unsigned int n_plt_entries; ++ unsigned long *tramp; ++ unsigned long data_words; ++ unsigned int rel_offset_words; ++ ++ //DPRINTF("init_got plt=%x, tpnt=%x\n", (unsigned long)plt,(unsigned long)tpnt); ++ ++ n_plt_entries = tpnt->dynamic_info[DT_PLTRELSZ] / sizeof(ELF_RELOC); ++ //DPRINTF("n_plt_entries %d\n",n_plt_entries); ++ ++ rel_offset_words = PLT_DATA_START_WORDS(n_plt_entries); ++ //DPRINTF("rel_offset_words %x\n",rel_offset_words); ++ data_words = (unsigned long)(plt + rel_offset_words); ++ //DPRINTF("data_words %x\n",data_words); ++ ++ tpnt->data_words = data_words; ++ ++ plt[PLT_LONGBRANCH_ENTRY_WORDS] = OPCODE_ADDIS_HI(11, 11, data_words); ++ plt[PLT_LONGBRANCH_ENTRY_WORDS+1] = OPCODE_LWZ(11,data_words,11); ++ ++ plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR(11); ++ plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR(); ++ ++ /* [4] */ ++ /* [5] */ ++ ++ tramp = plt + PLT_TRAMPOLINE_ENTRY_WORDS; ++ tramp[0] = OPCODE_ADDIS_HI(11,11,-data_words); ++ tramp[1] = OPCODE_ADDI(11,11,-data_words); ++ tramp[2] = OPCODE_SLWI(12,11,1); ++ tramp[3] = OPCODE_ADD(11,12,11); ++ tramp[4] = OPCODE_LI(12,target_addr); ++ tramp[5] = OPCODE_ADDIS_HI(12,12,target_addr); ++ tramp[6] = OPCODE_MTCTR(12); ++ tramp[7] = OPCODE_LI(12,(unsigned long)tpnt); ++ tramp[8] = OPCODE_ADDIS_HI(12,12,(unsigned long)tpnt); ++ tramp[9] = OPCODE_BCTR(); ++ ++ /* [16] unused */ ++ /* [17] unused */ ++ ++ /* instructions were modified */ ++ PPC_DCBST(plt); ++ PPC_DCBST(plt+4); ++ PPC_DCBST(plt+8); ++ PPC_DCBST(plt+12); ++ PPC_DCBST(plt+16-1); ++ PPC_SYNC; ++ PPC_ICBI(plt); ++ PPC_ICBI(plt+4); /* glibc thinks this is not needed */ ++ PPC_ICBI(plt+8); /* glibc thinks this is not needed */ ++ PPC_ICBI(plt+12); /* glibc thinks this is not needed */ ++ PPC_ICBI(plt+16-1); ++ PPC_ISYNC; ++} ++ ++unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) ++{ ++ int reloc_type; ++ ELF_RELOC *this_reloc; ++ char *strtab; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rel_addr; ++ int symtab_index; ++ char *symname; ++ unsigned long insn_addr; ++ unsigned long *insns; ++ unsigned long new_addr; ++ unsigned long delta; ++ ++ rel_addr = (ELF_RELOC *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr); ++ ++ this_reloc = (void *)rel_addr + reloc_entry; ++ reloc_type = ELF32_R_TYPE(this_reloc->r_info); ++ symtab_index = ELF32_R_SYM(this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ symname = strtab + symtab[symtab_index].st_name; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab,strtab,symtab_index); ++ debug_reloc(symtab,strtab,this_reloc); ++#endif ++ ++ if (reloc_type != R_PPC_JMP_SLOT) { ++ _dl_dprintf(2, "%s: Incorrect relocation type in jump relocation\n", _dl_progname); ++ _dl_exit(1); ++ }; ++ ++ /* Address of dump instruction to fix up */ ++ insn_addr = (unsigned long) tpnt->loadaddr + ++ (unsigned long) this_reloc->r_offset; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\n\tResolving symbol %s %x --> ", symname, insn_addr); ++#endif ++ ++ /* Get the address of the GOT entry */ ++ new_addr = (unsigned long) _dl_find_hash( ++ strtab + symtab[symtab_index].st_name, ++ tpnt->symbol_scope, tpnt, resolver); ++ if (!new_addr) { ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, symname); ++ _dl_exit(1); ++ }; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "%x\n", new_addr); ++#endif ++ ++ insns = (unsigned long *)insn_addr; ++ delta = new_addr - insn_addr; ++ ++ if(delta<<6>>6 == delta){ ++ insns[0] = OPCODE_B(delta); ++ }else if (new_addr <= 0x01fffffc || new_addr >= 0xfe000000){ ++ insns[0] = OPCODE_BA (new_addr); ++ }else{ ++ /* Warning: we don't handle double-sized PLT entries */ ++ unsigned long plt_addr; ++ unsigned long *ptr; ++ int index; ++ ++ plt_addr = (unsigned long)tpnt->dynamic_info[DT_PLTGOT] + ++ (unsigned long)tpnt->loadaddr; ++ ++ delta = PLT_LONGBRANCH_ENTRY_WORDS*4 - (insn_addr-plt_addr+4); ++ ++ index = (insn_addr - plt_addr - PLT_INITIAL_ENTRY_WORDS*4)/8; ++ ++ ptr = (unsigned long *)tpnt->data_words; ++ //DPRINTF("plt_addr=%x delta=%x index=%x ptr=%x\n", plt_addr, delta, index, ptr); ++ insns += 1; ++ ++ ptr[index] = new_addr; ++ PPC_SYNC; ++ /* icache sync is not necessary, since this will be a data load */ ++ //PPC_DCBST(ptr+index); ++ //PPC_SYNC; ++ //PPC_ICBI(ptr+index); ++ //PPC_ISYNC; ++ ++ insns[0] = OPCODE_B(delta); ++ ++ } ++ ++ /* instructions were modified */ ++ PPC_DCBST(insns); ++ PPC_SYNC; ++ PPC_ICBI(insns); ++ PPC_ISYNC; ++ ++ return new_addr; ++} ++ ++static int ++_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, ++ unsigned long rel_addr, unsigned long rel_size, ++ int (*reloc_fnc) (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab)) ++{ ++ unsigned int i; ++ char *strtab; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rpnt; ++ int symtab_index; ++ ++ /* Now parse the relocation information */ ++ rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof(ELF_RELOC); ++ ++ symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) { ++ int res; ++ ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ ++ /* When the dynamic linker bootstrapped itself, it resolved some symbols. ++ Make sure we do not do them again */ ++ if (!symtab_index && tpnt->libtype == program_interpreter) ++ continue; ++ if (symtab_index && tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab,strtab,symtab_index); ++ debug_reloc(symtab,strtab,rpnt); ++#endif ++ ++ res = reloc_fnc (tpnt, scope, rpnt, symtab, strtab); ++ ++ if (res==0) continue; ++ ++ _dl_dprintf(2, "\n%s: ",_dl_progname); ++ ++ if (symtab_index) ++ _dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name); ++ ++ if (res <0) ++ { ++ int reloc_type = ELF32_R_TYPE(rpnt->r_info); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); ++#else ++ _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); ++#endif ++ _dl_exit(-res); ++ } ++ else if (res >0) ++ { ++ _dl_dprintf(2, "can't resolve symbol\n"); ++ return res; ++ } ++ } ++ return 0; ++} ++ ++static int ++_dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ unsigned long reloc_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ (void)scope; ++ (void)symtab; ++ (void)strtab; ++ ++ reloc_addr = (unsigned long)tpnt->loadaddr + (unsigned long) rpnt->r_offset; ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = reloc_addr; ++#endif ++ ++ switch (reloc_type) { ++ case R_PPC_NONE: ++ return 0; ++ break; ++ case R_PPC_JMP_SLOT: ++ { ++ int index; ++ unsigned long delta; ++ unsigned long *plt; ++ unsigned long *insns; ++ ++ plt = (unsigned long *)(tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr); ++ ++ delta = (unsigned long)(plt+PLT_TRAMPOLINE_ENTRY_WORDS+2) - (reloc_addr+4); ++ ++ index = (reloc_addr - (unsigned long)(plt+PLT_INITIAL_ENTRY_WORDS)) ++ /sizeof(unsigned long); ++ index /= 2; ++ //DPRINTF(" index %x delta %x\n",index,delta); ++ insns = (unsigned long *)reloc_addr; ++ insns[0] = OPCODE_LI(11,index*4); ++ insns[1] = OPCODE_B(delta); ++ break; ++ } ++ default: ++#if 0 ++ _dl_dprintf(2, "%s: (LAZY) can't handle reloc type ", ++ _dl_progname); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); ++#endif ++ if (symtab_index) ++ _dl_dprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name); ++#endif ++ //_dl_exit(1); ++ return -1; ++ }; ++ ++ /* instructions were modified */ ++ PPC_DCBST(reloc_addr); ++ PPC_DCBST(reloc_addr+4); ++ PPC_SYNC; ++ PPC_ICBI(reloc_addr); ++ PPC_ICBI(reloc_addr+4); ++ PPC_ISYNC; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x", old_val, reloc_addr); ++#endif ++ return 0; ++ ++} ++ ++static int ++_dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ char *symname; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, ++ (reloc_type == R_PPC_JMP_SLOT ? tpnt : NULL), symbolrel); ++ ++ /* ++ * We want to allow undefined references to weak symbols - this might ++ * have been intentional. We should not be linking local symbols ++ * here, so all bases should be covered. ++ */ ++ ++ if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "\tglobal symbol '%s' already defined in '%s'\n", ++ symname, tpnt->libname); ++#endif ++ return 0; ++ } ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_PPC_NONE: ++ return 0; ++ break; ++ case R_PPC_REL24: ++#if 0 ++ { ++ unsigned long delta = symbol_addr - (unsigned long)reloc_addr; ++ if(delta<<6>>6 != delta){ ++ _dl_dprintf(2,"R_PPC_REL24: Reloc out of range\n"); ++ _dl_exit(1); ++ } ++ *reloc_addr &= 0xfc000003; ++ *reloc_addr |= delta&0x03fffffc; ++ } ++ break; ++#else ++ _dl_dprintf(2, "%s: symbol '%s' is type R_PPC_REL24\n\tCompile shared libraries with -fPIC!\n", ++ _dl_progname, symname); ++ _dl_exit(1); ++#endif ++ case R_PPC_RELATIVE: ++ *reloc_addr = (unsigned long)tpnt->loadaddr + (unsigned long)rpnt->r_addend; ++ break; ++ case R_PPC_ADDR32: ++ *reloc_addr += symbol_addr; ++ break; ++ case R_PPC_ADDR16_HA: ++ /* XXX is this correct? */ ++ *(short *)reloc_addr += (symbol_addr+0x8000)>>16; ++ break; ++ case R_PPC_ADDR16_HI: ++ *(short *)reloc_addr += symbol_addr>>16; ++ break; ++ case R_PPC_ADDR16_LO: ++ *(short *)reloc_addr += symbol_addr; ++ break; ++ case R_PPC_JMP_SLOT: ++ { ++ unsigned long targ_addr = (unsigned long)*reloc_addr; ++ unsigned long delta = targ_addr - (unsigned long)reloc_addr; ++ if(delta<<6>>6 == delta){ ++ *reloc_addr = OPCODE_B(delta); ++ }else if (targ_addr <= 0x01fffffc || targ_addr >= 0xfe000000){ ++ *reloc_addr = OPCODE_BA (targ_addr); ++ }else{ ++ { ++ int index; ++ unsigned long delta2; ++ unsigned long *plt, *ptr; ++ plt = (unsigned long *)(tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr); ++ ++ delta2 = (unsigned long)(plt+PLT_LONGBRANCH_ENTRY_WORDS) ++ - (unsigned long)(reloc_addr+1); ++ ++ index = ((unsigned long)reloc_addr - ++ (unsigned long)(plt+PLT_INITIAL_ENTRY_WORDS)) ++ /sizeof(unsigned long); ++ index /= 2; ++ //DPRINTF(" index %x delta %x\n",index,delta2); ++ ptr = (unsigned long *)tpnt->data_words; ++ ptr[index] = targ_addr; ++ reloc_addr[0] = OPCODE_LI(11,index*4); ++ reloc_addr[1] = OPCODE_B(delta2); ++ ++ /* instructions were modified */ ++ PPC_DCBST(reloc_addr+1); ++ PPC_SYNC; ++ PPC_ICBI(reloc_addr+1); ++ } ++ } ++ break; ++ } ++ case R_PPC_GLOB_DAT: ++ *reloc_addr += symbol_addr; ++ break; ++ case R_PPC_COPY: ++ // handled later ++ return 0; ++ break; ++ default: ++#if 0 ++ _dl_dprintf(2, "%s: can't handle reloc type ", _dl_progname); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); ++#endif ++ if (symtab_index) ++ _dl_dprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name); ++#endif ++ //_dl_exit(1); ++ return -1; ++ }; ++ ++ /* instructions were modified */ ++ PPC_DCBST(reloc_addr); ++ PPC_SYNC; ++ PPC_ICBI(reloc_addr); ++ PPC_ISYNC; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ ++ return 0; ++} ++ ++ ++/* This is done as a separate step, because there are cases where ++ information is first copied and later initialized. This results in ++ the wrong information being copied. Someone at Sun was complaining about ++ a bug in the handling of _COPY by SVr4, and this may in fact be what he ++ was talking about. Sigh. */ ++static int ++_dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ int goof = 0; ++ char *symname; ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ if (reloc_type != R_PPC_COPY) ++ return 0; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, NULL, copyrel); ++ if (!symbol_addr) goof++; ++ } ++ if (!goof) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_move) ++ _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", ++ symname, symtab[symtab_index].st_size, ++ symbol_addr, symtab[symtab_index].st_value); ++#endif ++ _dl_memcpy((char *) reloc_addr, ++ (char *) symbol_addr, symtab[symtab_index].st_size); ++ } ++ ++ return goof; ++} ++ ++void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void) type; ++ (void)_dl_parse(tpnt, NULL, rel_addr, rel_size, _dl_do_lazy_reloc); ++} ++ ++int _dl_parse_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void) type; ++ return _dl_parse(tpnt, tpnt->symbol_scope, rel_addr, rel_size, _dl_do_reloc); ++} ++ ++int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ (void) type; ++ return _dl_parse(xpnt->dyn, xpnt->next, rel_addr, rel_size, _dl_do_copy); ++} ++ ++ +diff -urN uClibc/ldso-0.9.24/ldso/powerpc/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/powerpc/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/ld_syscalls.h 2003-06-14 20:08:43.000000000 -0500 +@@ -0,0 +1,244 @@ ++/* ++ * This file contains the system call macros and syscall ++ * numbers used by the shared library loader. ++ */ ++ ++#define __NR_exit 1 ++#define __NR_read 3 ++#define __NR_write 4 ++#define __NR_open 5 ++#define __NR_close 6 ++#define __NR_getpid 20 ++#define __NR_getuid 24 ++#define __NR_geteuid 49 ++#define __NR_getgid 47 ++#define __NR_getegid 50 ++#define __NR_readlink 85 ++#define __NR_mmap 90 ++#define __NR_munmap 91 ++#define __NR_stat 106 ++#define __NR_mprotect 125 ++ ++/* Here are the macros which define how this platform makes ++ * system calls. This particular variant does _not_ set ++ * errno (note how it is disabled in __syscall_return) since ++ * these will get called before the errno symbol is dynamicly ++ * linked. */ ++ ++#undef __syscall_return ++#define __syscall_return(type) \ ++ return (__sc_err & 0x10000000 ? /*errno = __sc_ret,*/ __sc_ret = -1 : 0), \ ++ (type) __sc_ret ++ ++#undef __syscall_clobbers ++#define __syscall_clobbers \ ++ "r9", "r10", "r11", "r12" ++ //"r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ++ ++#undef _syscall0 ++#define _syscall0(type,name) \ ++type name(void) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0) \ ++ : "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++#undef _syscall1 ++#define _syscall1(type,name,type1,arg1) \ ++type name(type1 arg1) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ \ ++ __sc_3 = (unsigned long) (arg1); \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0) \ ++ : "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++#undef _syscall2 ++#define _syscall2(type,name,type1,arg1,type2,arg2) \ ++type name(type1 arg1, type2 arg2) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ register unsigned long __sc_4 __asm__ ("r4"); \ ++ \ ++ __sc_3 = (unsigned long) (arg1); \ ++ __sc_4 = (unsigned long) (arg2); \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0), \ ++ "r" (__sc_4) \ ++ : "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++#undef _syscall3 ++#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ ++type name(type1 arg1, type2 arg2, type3 arg3) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ register unsigned long __sc_4 __asm__ ("r4"); \ ++ register unsigned long __sc_5 __asm__ ("r5"); \ ++ \ ++ __sc_3 = (unsigned long) (arg1); \ ++ __sc_4 = (unsigned long) (arg2); \ ++ __sc_5 = (unsigned long) (arg3); \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0), \ ++ "r" (__sc_4), \ ++ "r" (__sc_5) \ ++ : "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++#undef _syscall4 ++#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ ++type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ register unsigned long __sc_4 __asm__ ("r4"); \ ++ register unsigned long __sc_5 __asm__ ("r5"); \ ++ register unsigned long __sc_6 __asm__ ("r6"); \ ++ \ ++ __sc_3 = (unsigned long) (arg1); \ ++ __sc_4 = (unsigned long) (arg2); \ ++ __sc_5 = (unsigned long) (arg3); \ ++ __sc_6 = (unsigned long) (arg4); \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0), \ ++ "r" (__sc_4), \ ++ "r" (__sc_5), \ ++ "r" (__sc_6) \ ++ : "r7", "r8", "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++#undef _syscall5 ++#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ ++type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ register unsigned long __sc_4 __asm__ ("r4"); \ ++ register unsigned long __sc_5 __asm__ ("r5"); \ ++ register unsigned long __sc_6 __asm__ ("r6"); \ ++ register unsigned long __sc_7 __asm__ ("r7"); \ ++ \ ++ __sc_3 = (unsigned long) (arg1); \ ++ __sc_4 = (unsigned long) (arg2); \ ++ __sc_5 = (unsigned long) (arg3); \ ++ __sc_6 = (unsigned long) (arg4); \ ++ __sc_7 = (unsigned long) (arg5); \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0), \ ++ "r" (__sc_4), \ ++ "r" (__sc_5), \ ++ "r" (__sc_6), \ ++ "r" (__sc_7) \ ++ : "r8", "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++ ++#undef _syscall6 ++#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \ ++type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) \ ++{ \ ++ unsigned long __sc_ret, __sc_err; \ ++ { \ ++ register unsigned long __sc_0 __asm__ ("r0"); \ ++ register unsigned long __sc_3 __asm__ ("r3"); \ ++ register unsigned long __sc_4 __asm__ ("r4"); \ ++ register unsigned long __sc_5 __asm__ ("r5"); \ ++ register unsigned long __sc_6 __asm__ ("r6"); \ ++ register unsigned long __sc_7 __asm__ ("r7"); \ ++ register unsigned long __sc_8 __asm__ ("r8"); \ ++ \ ++ __sc_3 = (unsigned long) (arg1); \ ++ __sc_4 = (unsigned long) (arg2); \ ++ __sc_5 = (unsigned long) (arg3); \ ++ __sc_6 = (unsigned long) (arg4); \ ++ __sc_7 = (unsigned long) (arg5); \ ++ __sc_8 = (unsigned long) (arg6); \ ++ __sc_0 = __NR_##name; \ ++ __asm__ __volatile__ \ ++ ("sc \n\t" \ ++ "mfcr %1 " \ ++ : "=&r" (__sc_3), "=&r" (__sc_0) \ ++ : "0" (__sc_3), "1" (__sc_0), \ ++ "r" (__sc_4), \ ++ "r" (__sc_5), \ ++ "r" (__sc_6), \ ++ "r" (__sc_7), \ ++ "r" (__sc_8) \ ++ : "r9", "r10", "r11", "r12" ); \ ++ __sc_ret = __sc_3; \ ++ __sc_err = __sc_0; \ ++ } \ ++ __syscall_return (type); \ ++} ++ ++ +diff -urN uClibc/ldso-0.9.24/ldso/powerpc/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/powerpc/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/ld_sysdep.h 2003-12-03 17:38:43.000000000 -0600 +@@ -0,0 +1,136 @@ ++/* ++ * Various assmbly language/system dependent hacks that are required ++ * so that we can minimize the amount of platform specific code. ++ */ ++ ++/* ++ * Define this if the system uses RELOCA. ++ */ ++#define ELF_USES_RELOCA ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long*) ARGS)+1) ++ ++/* ++ * Initialization sequence for a GOT. ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) _dl_init_got(GOT_BASE,MODULE) ++ ++/* Stuff for the PLT. */ ++#define PLT_INITIAL_ENTRY_WORDS 18 ++#define PLT_LONGBRANCH_ENTRY_WORDS 0 ++#define PLT_TRAMPOLINE_ENTRY_WORDS 6 ++#define PLT_DOUBLE_SIZE (1<<13) ++#define PLT_ENTRY_START_WORDS(entry_number) \ ++ (PLT_INITIAL_ENTRY_WORDS + (entry_number)*2 \ ++ + ((entry_number) > PLT_DOUBLE_SIZE \ ++ ? ((entry_number) - PLT_DOUBLE_SIZE)*2 \ ++ : 0)) ++#define PLT_DATA_START_WORDS(num_entries) PLT_ENTRY_START_WORDS(num_entries) ++ ++/* Macros to build PowerPC opcode words. */ ++#define OPCODE_ADDI(rd,ra,simm) \ ++ (0x38000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff)) ++#define OPCODE_ADDIS(rd,ra,simm) \ ++ (0x3c000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff)) ++#define OPCODE_ADD(rd,ra,rb) \ ++ (0x7c000214 | (rd) << 21 | (ra) << 16 | (rb) << 11) ++#define OPCODE_B(target) (0x48000000 | ((target) & 0x03fffffc)) ++#define OPCODE_BA(target) (0x48000002 | ((target) & 0x03fffffc)) ++#define OPCODE_BCTR() 0x4e800420 ++#define OPCODE_LWZ(rd,d,ra) \ ++ (0x80000000 | (rd) << 21 | (ra) << 16 | ((d) & 0xffff)) ++#define OPCODE_LWZU(rd,d,ra) \ ++ (0x84000000 | (rd) << 21 | (ra) << 16 | ((d) & 0xffff)) ++#define OPCODE_MTCTR(rd) (0x7C0903A6 | (rd) << 21) ++#define OPCODE_RLWINM(ra,rs,sh,mb,me) \ ++ (0x54000000 | (rs) << 21 | (ra) << 16 | (sh) << 11 | (mb) << 6 | (me) << 1) ++ ++#define OPCODE_LI(rd,simm) OPCODE_ADDI(rd,0,simm) ++#define OPCODE_ADDIS_HI(rd,ra,value) \ ++ OPCODE_ADDIS(rd,ra,((value) + 0x8000) >> 16) ++#define OPCODE_LIS_HI(rd,value) OPCODE_ADDIS_HI(rd,0,value) ++#define OPCODE_SLWI(ra,rs,sh) OPCODE_RLWINM(ra,rs,sh,0,31-sh) ++ ++ ++#define PPC_DCBST(where) asm volatile ("dcbst 0,%0" : : "r"(where) : "memory") ++#define PPC_SYNC asm volatile ("sync" : : : "memory") ++#define PPC_ISYNC asm volatile ("sync; isync" : : : "memory") ++#define PPC_ICBI(where) asm volatile ("icbi 0,%0" : : "r"(where) : "memory") ++#define PPC_DIE asm volatile ("tweq 0,0") ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. RELP is the relocation that we ++ * are performing, REL is the pointer to the address we are relocating. ++ * SYMBOL is the symbol involved in the relocation, and LOAD is the ++ * load address. ++ */ ++// finaladdr = LOAD ? ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ {int type=ELF32_R_TYPE((RELP)->r_info); \ ++ if(type==R_PPC_NONE){ \ ++ }else if(type==R_PPC_ADDR32){ \ ++ *REL += (SYMBOL); \ ++ }else if(type==R_PPC_RELATIVE){ \ ++ *REL = (Elf32_Word)(LOAD) + (RELP)->r_addend; \ ++ }else if(type==R_PPC_REL24){ \ ++ Elf32_Sword delta = (Elf32_Word)(SYMBOL) - (Elf32_Word)(REL); \ ++ *REL &= 0xfc000003; \ ++ *REL |= (delta & 0x03fffffc); \ ++ }else if(type==R_PPC_JMP_SLOT){ \ ++ Elf32_Sword delta = (Elf32_Word)(SYMBOL) - (Elf32_Word)(REL); \ ++ /*if (delta << 6 >> 6 != delta)_dl_exit(99);*/ \ ++ *REL = OPCODE_B(delta); \ ++ }else{ \ ++ _dl_exit(100+ELF32_R_TYPE((RELP)->r_info)); \ ++ } \ ++ if(type!=R_PPC_NONE){ \ ++ PPC_DCBST(REL); PPC_SYNC; PPC_ICBI(REL);\ ++ } \ ++ } ++ ++/* ++ * Transfer control to the user's application, once the dynamic loader ++ * is done. This routine has to exit the current function, then ++ * call the _dl_elf_main function. ++ */ ++ ++/* hgb@ifi.uio.no: ++ * Adding a clobber list consisting of r0 for %1. addi on PowerPC ++ * takes a register as the second argument, but if the register is ++ * r0, the value 0 is used instead. If r0 is used here, the stack ++ * pointer (r1) will be zeroed, and the dynamically linked ++ * application will seg.fault immediatly when receiving control. ++ */ ++#define START() \ ++ __asm__ volatile ( \ ++ "addi 1,%1,0\n\t" \ ++ "mtlr %0\n\t" \ ++ "blrl\n\t" \ ++ : : "r" (_dl_elf_main), "r" (args) \ ++ : "r0") ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++ ++#define MAGIC1 EM_PPC ++#undef MAGIC2 ++/* Used for error messages */ ++#define ELF_TARGET "powerpc" ++ ++struct elf_resolve; ++extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry); ++void _dl_init_got(unsigned long *lpnt,struct elf_resolve *tpnt); ++ ++ ++#define do_rem(result, n, base) result = (n % base) ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/powerpc/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/resolve.S +--- uClibc/ldso-0.9.24/ldso/powerpc/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/powerpc/resolve.S 2001-07-12 05:14:09.000000000 -0500 +@@ -0,0 +1,82 @@ ++/* ++ * Stolen from glibc-2.2.2 by David Schleef ++ */ ++ ++.text ++.align 4 ++ ++.globl _dl_linux_resolver ++ ++.globl _dl_linux_resolve ++.type _dl_linux_resolve,@function ++ ++_dl_linux_resolve: ++// We need to save the registers used to pass parameters, and register 0, ++// which is used by _mcount; the registers are saved in a stack frame. ++ stwu 1,-64(1) ++ stw 0,12(1) ++ stw 3,16(1) ++ stw 4,20(1) ++// The code that calls this has put parameters for 'fixup' in r12 and r11. ++ mr 3,12 ++ stw 5,24(1) ++ mr 4,11 ++ stw 6,28(1) ++ mflr 0 ++// We also need to save some of the condition register fields. ++ stw 7,32(1) ++ stw 0,48(1) ++ stw 8,36(1) ++ mfcr 0 ++ stw 9,40(1) ++ stw 10,44(1) ++ stw 0,8(1) ++ bl _dl_linux_resolver@local ++// 'fixup' returns the address we want to branch to. ++ mtctr 3 ++// Put the registers back... ++ lwz 0,48(1) ++ lwz 10,44(1) ++ lwz 9,40(1) ++ mtlr 0 ++ lwz 8,36(1) ++ lwz 0,8(1) ++ lwz 7,32(1) ++ lwz 6,28(1) ++ mtcrf 0xFF,0 ++ lwz 5,24(1) ++ lwz 4,20(1) ++ lwz 3,16(1) ++ lwz 0,12(1) ++// ...unwind the stack frame, and jump to the PLT entry we updated. ++ addi 1,1,64 ++ bctr ++ ++.LFE2: ++ .size _dl_linux_resolve,.LFE2-_dl_linux_resolve ++ ++#if 0 ++ ++ pusha /* preserve all regs */ ++ lea 0x20(%esp),%eax /* eax = tpnt and reloc_entry params */ ++ pushl 4(%eax) /* push copy of reloc_entry param */ ++ pushl (%eax) /* push copy of tpnt param */ ++ ++#ifdef __PIC__ ++ call .L24 ++.L24: ++ popl %ebx ++ addl $_GLOBAL_OFFSET_TABLE_+[.-.L24],%ebx ++ movl _dl_linux_resolver@GOT(%ebx),%ebx /* eax = resolved func */ ++ call *%ebx ++#else ++ call _dl_linux_resolver ++#endif ++ movl %eax,0x28(%esp) /* store func addr over original ++ * tpnt param */ ++ addl $0x8,%esp /* remove copy parameters */ ++ popa /* restore regs */ ++ ret $4 /* jump to func removing original ++ * reloc_entry param from stack */ ++#endif ++ +diff -urN uClibc/ldso-0.9.24/ldso/readelflib1.c uClibc.ldso.24/ldso-0.9.24/ldso/readelflib1.c +--- uClibc/ldso-0.9.24/ldso/readelflib1.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/readelflib1.c 2003-12-05 14:24:26.000000000 -0600 +@@ -0,0 +1,971 @@ ++/* vi: set sw=4 ts=4: */ ++/* Program to load an ELF binary on a linux system, and run it ++ * after resolving ELF shared library symbols ++ * ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, ++ * David Engel, Hongjiu Lu and Mitch D'Souza ++ * Copyright (C) 2001-2003, Erik Andersen ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++ ++/* This file contains the helper routines to load an ELF sharable ++ library into memory and add the symbol table info to the chain. */ ++ ++#ifdef USE_CACHE ++ ++static caddr_t _dl_cache_addr = NULL; ++static size_t _dl_cache_size = 0; ++ ++int _dl_map_cache(void) ++{ ++ int fd; ++ struct stat st; ++ header_t *header; ++ libentry_t *libent; ++ int i, strtabsize; ++ ++ if (_dl_cache_addr == (caddr_t) - 1) ++ return -1; ++ else if (_dl_cache_addr != NULL) ++ return 0; ++ ++ if (_dl_stat(LDSO_CACHE, &st) ++ || (fd = _dl_open(LDSO_CACHE, O_RDONLY)) < 0) { ++ _dl_dprintf(2, "%s: can't open cache '%s'\n", _dl_progname, LDSO_CACHE); ++ _dl_cache_addr = (caddr_t) - 1; /* so we won't try again */ ++ return -1; ++ } ++ ++ _dl_cache_size = st.st_size; ++ _dl_cache_addr = (caddr_t) _dl_mmap(0, _dl_cache_size, PROT_READ, MAP_SHARED, fd, 0); ++ _dl_close(fd); ++ if (_dl_mmap_check_error(_dl_cache_addr)) { ++ _dl_dprintf(2, "%s: can't map cache '%s'\n", ++ _dl_progname, LDSO_CACHE); ++ return -1; ++ } ++ ++ header = (header_t *) _dl_cache_addr; ++ ++ if (_dl_cache_size < sizeof(header_t) || ++ _dl_memcmp(header->magic, LDSO_CACHE_MAGIC, LDSO_CACHE_MAGIC_LEN) ++ || _dl_memcmp(header->version, LDSO_CACHE_VER, LDSO_CACHE_VER_LEN) ++ || _dl_cache_size < ++ (sizeof(header_t) + header->nlibs * sizeof(libentry_t)) ++ || _dl_cache_addr[_dl_cache_size - 1] != '\0') ++ { ++ _dl_dprintf(2, "%s: cache '%s' is corrupt\n", _dl_progname, ++ LDSO_CACHE); ++ goto fail; ++ } ++ ++ strtabsize = _dl_cache_size - sizeof(header_t) - ++ header->nlibs * sizeof(libentry_t); ++ libent = (libentry_t *) & header[1]; ++ ++ for (i = 0; i < header->nlibs; i++) { ++ if (libent[i].sooffset >= strtabsize || ++ libent[i].liboffset >= strtabsize) ++ { ++ _dl_dprintf(2, "%s: cache '%s' is corrupt\n", _dl_progname, LDSO_CACHE); ++ goto fail; ++ } ++ } ++ ++ return 0; ++ ++ fail: ++ _dl_munmap(_dl_cache_addr, _dl_cache_size); ++ _dl_cache_addr = (caddr_t) - 1; ++ return -1; ++} ++ ++int _dl_unmap_cache(void) ++{ ++ if (_dl_cache_addr == NULL || _dl_cache_addr == (caddr_t) - 1) ++ return -1; ++ ++#if 1 ++ _dl_munmap(_dl_cache_addr, _dl_cache_size); ++ _dl_cache_addr = NULL; ++#endif ++ ++ return 0; ++} ++ ++#endif ++ ++/* This function's behavior must exactly match that ++ * in uClibc/ldso/util/ldd.c */ ++static struct elf_resolve * ++search_for_named_library(const char *name, int secure, const char *path_list, ++ struct dyn_elf **rpnt) ++{ ++ int i, count = 1; ++ char *path, *path_n; ++ char mylibname[2050]; ++ struct elf_resolve *tpnt1; ++ ++ if (path_list==NULL) ++ return NULL; ++ ++ /* We need a writable copy of this string */ ++ path = _dl_strdup(path_list); ++ if (!path) { ++ _dl_dprintf(2, "Out of memory!\n"); ++ _dl_exit(0); ++ } ++ ++ ++ /* Unlike ldd.c, don't bother to eliminate double //s */ ++ ++ ++ /* Replace colons with zeros in path_list and count them */ ++ for(i=_dl_strlen(path); i > 0; i--) { ++ if (path[i]==':') { ++ path[i]=0; ++ count++; ++ } ++ } ++ ++ path_n = path; ++ for (i = 0; i < count; i++) { ++ _dl_strcpy(mylibname, path_n); ++ _dl_strcat(mylibname, "/"); ++ _dl_strcat(mylibname, name); ++ if ((tpnt1 = _dl_load_elf_shared_library(secure, rpnt, mylibname)) != NULL) ++ { ++ return tpnt1; ++ } ++ path_n += (_dl_strlen(path_n) + 1); ++ } ++ return NULL; ++} ++ ++/* Check if the named library is already loaded... */ ++struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname) ++{ ++ const char *pnt, *pnt1; ++ struct elf_resolve *tpnt1; ++ const char *libname, *libname2; ++ static const char *libc = "libc.so."; ++ static const char *aborted_wrong_lib = "%s: aborted attempt to load %s!\n"; ++ ++ pnt = libname = full_libname; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) ++ _dl_dprintf(_dl_debug_file, "Checking if '%s' is already loaded\n", full_libname); ++#endif ++ /* quick hack to ensure mylibname buffer doesn't overflow. don't ++ allow full_libname or any directory to be longer than 1024. */ ++ if (_dl_strlen(full_libname) > 1024) ++ return NULL; ++ ++ /* Skip over any initial initial './' and '/' stuff to ++ * get the short form libname with no path garbage */ ++ pnt1 = _dl_strrchr(pnt, '/'); ++ if (pnt1) { ++ libname = pnt1 + 1; ++ } ++ ++ /* Make sure they are not trying to load the wrong C library! ++ * This sometimes happens esp with shared libraries when the ++ * library path is somehow wrong! */ ++#define isdigit(c) (c >= '0' && c <= '9') ++ if ((_dl_strncmp(libname, libc, 8) == 0) && _dl_strlen(libname) >=8 && ++ isdigit(libname[8])) ++ { ++ /* Abort attempts to load glibc, libc5, etc */ ++ if ( libname[8]!='0') { ++ if (!_dl_trace_loaded_objects) { ++ _dl_dprintf(2, aborted_wrong_lib, libname, _dl_progname); ++ _dl_exit(1); ++ } ++ return NULL; ++ } ++ } ++ ++ /* Critical step! Weed out duplicates early to avoid ++ * function aliasing, which wastes memory, and causes ++ * really bad things to happen with weaks and globals. */ ++ for (tpnt1 = _dl_loaded_modules; tpnt1; tpnt1 = tpnt1->next) { ++ ++ /* Skip over any initial initial './' and '/' stuff to ++ * get the short form libname with no path garbage */ ++ libname2 = tpnt1->libname; ++ pnt1 = _dl_strrchr(libname2, '/'); ++ if (pnt1) { ++ libname2 = pnt1 + 1; ++ } ++ ++ if (_dl_strcmp(libname2, libname) == 0) { ++ /* Well, that was certainly easy */ ++ return tpnt1; ++ } ++ } ++ ++ return NULL; ++} ++ ++ ++ ++/* ++ * Used to return error codes back to dlopen et. al. ++ */ ++ ++unsigned long _dl_error_number; ++unsigned long _dl_internal_error_number; ++extern char *_dl_ldsopath; ++ ++struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, ++ struct elf_resolve *tpnt, char *full_libname) ++{ ++ char *pnt, *pnt1; ++ struct elf_resolve *tpnt1; ++ char *libname; ++ ++ _dl_internal_error_number = 0; ++ libname = full_libname; ++ ++ /* quick hack to ensure mylibname buffer doesn't overflow. don't ++ allow full_libname or any directory to be longer than 1024. */ ++ if (_dl_strlen(full_libname) > 1024) ++ goto goof; ++ ++ /* Skip over any initial initial './' and '/' stuff to ++ * get the short form libname with no path garbage */ ++ pnt1 = _dl_strrchr(libname, '/'); ++ if (pnt1) { ++ libname = pnt1 + 1; ++ } ++ ++ /* Critical step! Weed out duplicates early to avoid ++ * function aliasing, which wastes memory, and causes ++ * really bad things to happen with weaks and globals. */ ++ if ((tpnt1=_dl_check_if_named_library_is_loaded(libname))!=NULL) ++ return tpnt1; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tfind library='%s'; searching\n", libname); ++#endif ++ /* If the filename has any '/', try it straight and leave it at that. ++ For IBCS2 compatibility under linux, we substitute the string ++ /usr/i486-sysv4/lib for /usr/lib in library names. */ ++ ++ if (libname != full_libname) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\ttrying file='%s'\n", full_libname); ++#endif ++ tpnt1 = _dl_load_elf_shared_library(secure, rpnt, full_libname); ++ if (tpnt1) { ++ return tpnt1; ++ } ++ //goto goof; ++ } ++ ++ /* ++ * The ABI specifies that RPATH is searched before LD_*_PATH or ++ * the default path of /usr/lib. Check in rpath directories. ++ */ ++ for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) { ++ if (tpnt->libtype == elf_executable) { ++ pnt = (char *) tpnt->dynamic_info[DT_RPATH]; ++ if (pnt) { ++ pnt += (unsigned long) tpnt->loadaddr + tpnt->dynamic_info[DT_STRTAB]; ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RPATH='%s'\n", pnt); ++#endif ++ if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) ++ { ++ return tpnt1; ++ } ++ } ++ } ++ } ++ ++ /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ ++ if (_dl_library_path) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); ++#endif ++ if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt)) != NULL) ++ { ++ return tpnt1; ++ } ++ } ++ ++ /* ++ * Where should the cache be searched? There is no such concept in the ++ * ABI, so we have some flexibility here. For now, search it before ++ * the hard coded paths that follow (i.e before /lib and /usr/lib). ++ */ ++#ifdef USE_CACHE ++ if (_dl_cache_addr != NULL && _dl_cache_addr != (caddr_t) - 1) { ++ int i; ++ header_t *header = (header_t *) _dl_cache_addr; ++ libentry_t *libent = (libentry_t *) & header[1]; ++ char *strs = (char *) &libent[header->nlibs]; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching cache='%s'\n", LDSO_CACHE); ++#endif ++ for (i = 0; i < header->nlibs; i++) { ++ if ((libent[i].flags == LIB_ELF || ++ libent[i].flags == LIB_ELF_LIBC5) && ++ _dl_strcmp(libname, strs + libent[i].sooffset) == 0 && ++ (tpnt1 = _dl_load_elf_shared_library(secure, ++ rpnt, strs + libent[i].liboffset))) ++ return tpnt1; ++ } ++ } ++#endif ++ ++ /* Look for libraries wherever the shared library loader ++ * was installed */ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching ldso dir='%s'\n", _dl_ldsopath); ++#endif ++ if ((tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt)) != NULL) ++ { ++ return tpnt1; ++ } ++ ++ ++ /* Lastly, search the standard list of paths for the library. ++ This list must exactly match the list in uClibc/ldso/util/ldd.c */ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching full lib path list\n"); ++#endif ++ if ((tpnt1 = search_for_named_library(libname, secure, ++ UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib:" ++ UCLIBC_RUNTIME_PREFIX "usr/lib:" ++ UCLIBC_RUNTIME_PREFIX "lib:" ++ "/usr/lib:" ++ "/lib", rpnt) ++ ) != NULL) ++ { ++ return tpnt1; ++ } ++ ++goof: ++ /* Well, we shot our wad on that one. All we can do now is punt */ ++ if (_dl_internal_error_number) ++ _dl_error_number = _dl_internal_error_number; ++ else ++ _dl_error_number = LD_ERROR_NOFILE; ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(2, "Bummer: could not find '%s'!\n", libname); ++#endif ++ return NULL; ++} ++ ++ ++/* ++ * Read one ELF library into memory, mmap it into the correct locations and ++ * add the symbol info to the symbol chain. Perform any relocations that ++ * are required. ++ */ ++ ++struct elf_resolve *_dl_load_elf_shared_library(int secure, ++ struct dyn_elf **rpnt, char *libname) ++{ ++ ElfW(Ehdr) *epnt; ++ unsigned long dynamic_addr = 0; ++ unsigned long dynamic_size = 0; ++ Elf32_Dyn *dpnt; ++ struct elf_resolve *tpnt; ++ ElfW(Phdr) *ppnt; ++ char *status, *header; ++ unsigned long dynamic_info[24]; ++ unsigned long *lpnt; ++ unsigned long libaddr; ++ unsigned long minvma = 0xffffffff, maxvma = 0; ++ int i, flags, piclib, infile; ++ ++ /* If this file is already loaded, skip this step */ ++ tpnt = _dl_check_hashed_files(libname); ++ if (tpnt) { ++ if (*rpnt) { ++ (*rpnt)->next = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); ++ _dl_memset((*rpnt)->next, 0, sizeof(struct dyn_elf)); ++ (*rpnt)->next->prev = (*rpnt); ++ *rpnt = (*rpnt)->next; ++ (*rpnt)->dyn = tpnt; ++ tpnt->symbol_scope = _dl_symbol_tables; ++ } ++ tpnt->usage_count++; ++ tpnt->libtype = elf_lib; ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(2, "file='%s'; already loaded\n", libname); ++#endif ++ return tpnt; ++ } ++ ++ /* If we are in secure mode (i.e. a setu/gid binary using LD_PRELOAD), ++ we don't load the library if it isn't setuid. */ ++ ++ if (secure) { ++ struct stat st; ++ ++ if (_dl_stat(libname, &st) || !(st.st_mode & S_ISUID)) ++ return NULL; ++ } ++ ++ libaddr = 0; ++ infile = _dl_open(libname, O_RDONLY); ++ if (infile < 0) { ++#if 0 ++ /* ++ * NO! When we open shared libraries we may search several paths. ++ * it is inappropriate to generate an error here. ++ */ ++ _dl_dprintf(2, "%s: can't open '%s'\n", _dl_progname, libname); ++#endif ++ _dl_internal_error_number = LD_ERROR_NOFILE; ++ return NULL; ++ } ++ ++ header = _dl_mmap((void *) 0, 4096, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); ++ if (_dl_mmap_check_error(header)) { ++ _dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname); ++ _dl_internal_error_number = LD_ERROR_MMAP_FAILED; ++ _dl_close(infile); ++ return NULL; ++ }; ++ ++ _dl_read(infile, header, 4096); ++ epnt = (ElfW(Ehdr) *) (intptr_t) header; ++ if (epnt->e_ident[0] != 0x7f || ++ epnt->e_ident[1] != 'E' || ++ epnt->e_ident[2] != 'L' || ++ epnt->e_ident[3] != 'F') ++ { ++ _dl_dprintf(2, "%s: '%s' is not an ELF file\n", _dl_progname, ++ libname); ++ _dl_internal_error_number = LD_ERROR_NOTELF; ++ _dl_close(infile); ++ _dl_munmap(header, 4096); ++ return NULL; ++ }; ++ ++ if ((epnt->e_type != ET_DYN) || (epnt->e_machine != MAGIC1 ++#ifdef MAGIC2 ++ && epnt->e_machine != MAGIC2 ++#endif ++ )) ++ { ++ _dl_internal_error_number = ++ (epnt->e_type != ET_DYN ? LD_ERROR_NOTDYN : LD_ERROR_NOTMAGIC); ++ _dl_dprintf(2, "%s: '%s' is not an ELF executable for " ELF_TARGET ++ "\n", _dl_progname, libname); ++ _dl_close(infile); ++ _dl_munmap(header, 4096); ++ return NULL; ++ }; ++ ++ ppnt = (ElfW(Phdr) *)(intptr_t) & header[epnt->e_phoff]; ++ ++ piclib = 1; ++ for (i = 0; i < epnt->e_phnum; i++) { ++ ++ if (ppnt->p_type == PT_DYNAMIC) { ++ if (dynamic_addr) ++ _dl_dprintf(2, "%s: '%s' has more than one dynamic section\n", ++ _dl_progname, libname); ++ dynamic_addr = ppnt->p_vaddr; ++ dynamic_size = ppnt->p_filesz; ++ }; ++ ++ if (ppnt->p_type == PT_LOAD) { ++ /* See if this is a PIC library. */ ++ if (i == 0 && ppnt->p_vaddr > 0x1000000) { ++ piclib = 0; ++ minvma = ppnt->p_vaddr; ++ } ++ if (piclib && ppnt->p_vaddr < minvma) { ++ minvma = ppnt->p_vaddr; ++ } ++ if (((unsigned long) ppnt->p_vaddr + ppnt->p_memsz) > maxvma) { ++ maxvma = ppnt->p_vaddr + ppnt->p_memsz; ++ } ++ } ++ ppnt++; ++ }; ++ ++ maxvma = (maxvma + ADDR_ALIGN) & ~ADDR_ALIGN; ++ minvma = minvma & ~0xffffU; ++ ++ flags = MAP_PRIVATE /*| MAP_DENYWRITE */ ; ++ if (!piclib) ++ flags |= MAP_FIXED; ++ ++ status = (char *) _dl_mmap((char *) (piclib ? 0 : minvma), ++ maxvma - minvma, PROT_NONE, flags | MAP_ANONYMOUS, -1, 0); ++ if (_dl_mmap_check_error(status)) { ++ _dl_dprintf(2, "%s: can't map %s\n", _dl_progname, libname); ++ _dl_internal_error_number = LD_ERROR_MMAP_FAILED; ++ _dl_close(infile); ++ _dl_munmap(header, 4096); ++ return NULL; ++ }; ++ libaddr = (unsigned long) status; ++ flags |= MAP_FIXED; ++ ++ /* Get the memory to store the library */ ++ ppnt = (ElfW(Phdr) *)(intptr_t) & header[epnt->e_phoff]; ++ ++ for (i = 0; i < epnt->e_phnum; i++) { ++ if (ppnt->p_type == PT_LOAD) { ++ ++ /* See if this is a PIC library. */ ++ if (i == 0 && ppnt->p_vaddr > 0x1000000) { ++ piclib = 0; ++ /* flags |= MAP_FIXED; */ ++ } ++ ++ ++ ++ if (ppnt->p_flags & PF_W) { ++ unsigned long map_size; ++ char *cpnt; ++ ++ status = (char *) _dl_mmap((char *) ((piclib ? libaddr : 0) + ++ (ppnt->p_vaddr & PAGE_ALIGN)), (ppnt->p_vaddr & ADDR_ALIGN) ++ + ppnt->p_filesz, LXFLAGS(ppnt->p_flags), flags, infile, ++ ppnt->p_offset & OFFS_ALIGN); ++ ++ if (_dl_mmap_check_error(status)) { ++ _dl_dprintf(2, "%s: can't map '%s'\n", ++ _dl_progname, libname); ++ _dl_internal_error_number = LD_ERROR_MMAP_FAILED; ++ _dl_munmap((char *) libaddr, maxvma - minvma); ++ _dl_close(infile); ++ _dl_munmap(header, 4096); ++ return NULL; ++ }; ++ ++ /* Pad the last page with zeroes. */ ++ cpnt = (char *) (status + (ppnt->p_vaddr & ADDR_ALIGN) + ++ ppnt->p_filesz); ++ while (((unsigned long) cpnt) & ADDR_ALIGN) ++ *cpnt++ = 0; ++ ++ /* I am not quite sure if this is completely ++ * correct to do or not, but the basic way that ++ * we handle bss segments is that we mmap ++ * /dev/zero if there are any pages left over ++ * that are not mapped as part of the file */ ++ ++ map_size = (ppnt->p_vaddr + ppnt->p_filesz + ADDR_ALIGN) & PAGE_ALIGN; ++ ++ if (map_size < ppnt->p_vaddr + ppnt->p_memsz) ++ status = (char *) _dl_mmap((char *) map_size + ++ (piclib ? libaddr : 0), ++ ppnt->p_vaddr + ppnt->p_memsz - map_size, ++ LXFLAGS(ppnt->p_flags), flags | MAP_ANONYMOUS, -1, 0); ++ } else ++ status = (char *) _dl_mmap((char *) (ppnt->p_vaddr & PAGE_ALIGN) ++ + (piclib ? libaddr : 0), (ppnt->p_vaddr & ADDR_ALIGN) + ++ ppnt->p_filesz, LXFLAGS(ppnt->p_flags), flags, ++ infile, ppnt->p_offset & OFFS_ALIGN); ++ if (_dl_mmap_check_error(status)) { ++ _dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname); ++ _dl_internal_error_number = LD_ERROR_MMAP_FAILED; ++ _dl_munmap((char *) libaddr, maxvma - minvma); ++ _dl_close(infile); ++ _dl_munmap(header, 4096); ++ return NULL; ++ }; ++ ++ /* if(libaddr == 0 && piclib) { ++ libaddr = (unsigned long) status; ++ flags |= MAP_FIXED; ++ }; */ ++ }; ++ ppnt++; ++ }; ++ _dl_close(infile); ++ ++ /* For a non-PIC library, the addresses are all absolute */ ++ if (piclib) { ++ dynamic_addr += (unsigned long) libaddr; ++ } ++ ++ /* ++ * OK, the ELF library is now loaded into VM in the correct locations ++ * The next step is to go through and do the dynamic linking (if needed). ++ */ ++ ++ /* Start by scanning the dynamic section to get all of the pointers */ ++ ++ if (!dynamic_addr) { ++ _dl_internal_error_number = LD_ERROR_NODYNAMIC; ++ _dl_dprintf(2, "%s: '%s' is missing a dynamic section\n", ++ _dl_progname, libname); ++ _dl_munmap(header, 4096); ++ return NULL; ++ } ++ ++ dpnt = (Elf32_Dyn *) dynamic_addr; ++ ++ dynamic_size = dynamic_size / sizeof(Elf32_Dyn); ++ _dl_memset(dynamic_info, 0, sizeof(dynamic_info)); ++ ++#if defined(__mips__) ++ { ++ ++ int indx = 1; ++ Elf32_Dyn *dpnt = (Elf32_Dyn *) dynamic_addr; ++ ++ while(dpnt->d_tag) { ++ dpnt++; ++ indx++; ++ } ++ dynamic_size = indx; ++ } ++#endif ++ ++ { ++ unsigned long indx; ++ ++ for (indx = 0; indx < dynamic_size; indx++) ++ { ++ if (dpnt->d_tag > DT_JMPREL) { ++ dpnt++; ++ continue; ++ } ++ dynamic_info[dpnt->d_tag] = dpnt->d_un.d_val; ++ if (dpnt->d_tag == DT_TEXTREL) ++ dynamic_info[DT_TEXTREL] = 1; ++ dpnt++; ++ }; ++ } ++ ++ /* If the TEXTREL is set, this means that we need to make the pages ++ writable before we perform relocations. Do this now. They get set ++ back again later. */ ++ ++ if (dynamic_info[DT_TEXTREL]) { ++#ifndef FORCE_SHAREABLE_TEXT_SEGMENTS ++ ppnt = (ElfW(Phdr) *)(intptr_t) & header[epnt->e_phoff]; ++ for (i = 0; i < epnt->e_phnum; i++, ppnt++) { ++ if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) ++ _dl_mprotect((void *) ((piclib ? libaddr : 0) + ++ (ppnt->p_vaddr & PAGE_ALIGN)), ++ (ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz, ++ PROT_READ | PROT_WRITE | PROT_EXEC); ++ } ++#else ++ _dl_dprintf(_dl_debug_file, "Can't modify %s's text section. Use GCC option -fPIC for shared objects, please.\n",libname); ++ _dl_exit(1); ++#endif ++ } ++ ++ tpnt = _dl_add_elf_hash_table(libname, (char *) libaddr, dynamic_info, ++ dynamic_addr, dynamic_size); ++ ++ tpnt->ppnt = (ElfW(Phdr) *)(intptr_t) (tpnt->loadaddr + epnt->e_phoff); ++ tpnt->n_phent = epnt->e_phnum; ++ ++ /* ++ * Add this object into the symbol chain ++ */ ++ if (*rpnt) { ++ (*rpnt)->next = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); ++ _dl_memset((*rpnt)->next, 0, sizeof(struct dyn_elf)); ++ (*rpnt)->next->prev = (*rpnt); ++ *rpnt = (*rpnt)->next; ++ (*rpnt)->dyn = tpnt; ++ tpnt->symbol_scope = _dl_symbol_tables; ++ } ++ tpnt->usage_count++; ++ tpnt->libtype = elf_lib; ++ ++ /* ++ * OK, the next thing we need to do is to insert the dynamic linker into ++ * the proper entry in the GOT so that the PLT symbols can be properly ++ * resolved. ++ */ ++ ++ lpnt = (unsigned long *) dynamic_info[DT_PLTGOT]; ++ ++ if (lpnt) { ++ lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT] + ++ ((int) libaddr)); ++ INIT_GOT(lpnt, tpnt); ++ }; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) { ++ _dl_dprintf(2, "\n\tfile='%s'; generating link map\n", libname); ++ _dl_dprintf(2, "\t\tdynamic: %x base: %x size: %x\n", ++ dynamic_addr, libaddr, dynamic_size); ++ _dl_dprintf(2, "\t\t entry: %x phdr: %x phnum: %d\n\n", ++ epnt->e_entry + libaddr, tpnt->ppnt, tpnt->n_phent); ++ ++ } ++#endif ++ _dl_munmap(header, 4096); ++ ++ return tpnt; ++} ++ ++/* Ugly, ugly. Some versions of the SVr4 linker fail to generate COPY ++ relocations for global variables that are present both in the image and ++ the shared library. Go through and do it manually. If the images ++ are guaranteed to be generated by a trustworthy linker, then this ++ step can be skipped. */ ++ ++int _dl_copy_fixups(struct dyn_elf *rpnt) ++{ ++ int goof = 0; ++ struct elf_resolve *tpnt; ++ ++ if (rpnt->next) ++ goof += _dl_copy_fixups(rpnt->next); ++ else ++ return 0; ++ ++ tpnt = rpnt->dyn; ++ ++ if (tpnt->init_flag & COPY_RELOCS_DONE) ++ return goof; ++ tpnt->init_flag |= COPY_RELOCS_DONE; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s", tpnt->libname); ++#endif ++ ++#ifdef ELF_USES_RELOCA ++ goof += _dl_parse_copy_information(rpnt, ++ tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0); ++ ++#else ++ goof += _dl_parse_copy_information(rpnt, tpnt->dynamic_info[DT_REL], ++ tpnt->dynamic_info[DT_RELSZ], 0); ++ ++#endif ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation copy fixups: %s; finished\n\n", tpnt->libname); ++#endif ++ return goof; ++} ++ ++/* Minimal printf which handles only %s, %d, and %x */ ++void _dl_dprintf(int fd, const char *fmt, ...) ++{ ++ int num; ++ va_list args; ++ char *start, *ptr, *string; ++ static char *buf; ++ ++ buf = _dl_mmap((void *) 0, 4096, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); ++ if (_dl_mmap_check_error(buf)) { ++ _dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname); ++ _dl_exit(20); ++ } ++ ++ start = ptr = buf; ++ ++ if (!fmt) ++ return; ++ ++ if (_dl_strlen(fmt) >= (sizeof(buf) - 1)) ++ _dl_write(fd, "(overflow)\n", 10); ++ ++ _dl_strcpy(buf, fmt); ++ va_start(args, fmt); ++ ++ while (start) { ++ while (*ptr != '%' && *ptr) { ++ ptr++; ++ } ++ ++ if (*ptr == '%') { ++ *ptr++ = '\0'; ++ _dl_write(fd, start, _dl_strlen(start)); ++ ++ switch (*ptr++) { ++ case 's': ++ string = va_arg(args, char *); ++ ++ if (!string) ++ _dl_write(fd, "(null)", 6); ++ else ++ _dl_write(fd, string, _dl_strlen(string)); ++ break; ++ ++ case 'i': ++ case 'd': ++ { ++ char tmp[22]; ++ num = va_arg(args, int); ++ ++ string = _dl_simple_ltoa(tmp, num); ++ _dl_write(fd, string, _dl_strlen(string)); ++ break; ++ } ++ case 'x': ++ case 'X': ++ { ++ char tmp[22]; ++ num = va_arg(args, int); ++ ++ string = _dl_simple_ltoahex(tmp, num); ++ _dl_write(fd, string, _dl_strlen(string)); ++ break; ++ } ++ default: ++ _dl_write(fd, "(null)", 6); ++ break; ++ } ++ ++ start = ptr; ++ } else { ++ _dl_write(fd, start, _dl_strlen(start)); ++ start = NULL; ++ } ++ } ++ _dl_munmap(buf, 4096); ++ return; ++} ++ ++char *_dl_strdup(const char *string) ++{ ++ char *retval; ++ int len; ++ ++ len = _dl_strlen(string); ++ retval = _dl_malloc(len + 1); ++ _dl_strcpy(retval, string); ++ return retval; ++} ++ ++void *(*_dl_malloc_function) (size_t size) = NULL; ++void *_dl_malloc(int size) ++{ ++ void *retval; ++ ++#if 0 ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(2, "malloc: request for %d bytes\n", size); ++#endif ++#endif ++ ++ if (_dl_malloc_function) ++ return (*_dl_malloc_function) (size); ++ ++ if (_dl_malloc_addr - _dl_mmap_zero + size > 4096) { ++#ifdef __SUPPORT_LD_DEBUG_EARLY__ ++ _dl_dprintf(2, "malloc: mmapping more memory\n"); ++#endif ++ _dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size, ++ PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); ++ if (_dl_mmap_check_error(_dl_mmap_zero)) { ++ _dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname); ++ _dl_exit(20); ++ } ++ } ++ retval = _dl_malloc_addr; ++ _dl_malloc_addr += size; ++ ++ /* ++ * Align memory to 4 byte boundary. Some platforms require this, others ++ * simply get better performance. ++ */ ++ _dl_malloc_addr = (char *) (((unsigned long) _dl_malloc_addr + 3) & ~(3)); ++ return retval; ++} ++ ++int _dl_fixup(struct elf_resolve *tpnt, int flag) ++{ ++ int goof = 0; ++ ++ if (tpnt->next) ++ goof += _dl_fixup(tpnt->next, flag); ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); ++#endif ++ ++ if (tpnt->dynamic_info[DT_REL]) { ++#ifdef ELF_USES_RELOCA ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(2, "%s: can't handle REL relocation records\n", _dl_progname); ++#endif ++ goof++; ++ return goof; ++#else ++ if (tpnt->init_flag & RELOCS_DONE) ++ return goof; ++ tpnt->init_flag |= RELOCS_DONE; ++ goof += _dl_parse_relocation_information(tpnt, ++ tpnt->dynamic_info[DT_REL], ++ tpnt->dynamic_info[DT_RELSZ], 0); ++#endif ++ } ++ if (tpnt->dynamic_info[DT_RELA]) { ++#ifndef ELF_USES_RELOCA ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) _dl_dprintf(2, "%s: can't handle RELA relocation records\n", _dl_progname); ++#endif ++ goof++; ++ return goof; ++#else ++ if (tpnt->init_flag & RELOCS_DONE) ++ return goof; ++ tpnt->init_flag |= RELOCS_DONE; ++ goof += _dl_parse_relocation_information(tpnt, ++ tpnt->dynamic_info[DT_RELA], ++ tpnt->dynamic_info[DT_RELASZ], 0); ++#endif ++ } ++ if (tpnt->dynamic_info[DT_JMPREL]) { ++ if (tpnt->init_flag & JMP_RELOCS_DONE) ++ return goof; ++ tpnt->init_flag |= JMP_RELOCS_DONE; ++ if (flag & RTLD_LAZY) { ++ _dl_parse_lazy_relocation_information(tpnt, ++ tpnt->dynamic_info[DT_JMPREL], ++ tpnt->dynamic_info [DT_PLTRELSZ], 0); ++ } else { ++ goof += _dl_parse_relocation_information(tpnt, ++ tpnt->dynamic_info[DT_JMPREL], ++ tpnt->dynamic_info[DT_PLTRELSZ], 0); ++ } ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug) { ++ _dl_dprintf(_dl_debug_file,"\nrelocation processing: %s", tpnt->libname); ++ _dl_dprintf(_dl_debug_file,"; finished\n\n"); ++ } ++#endif ++ return goof; ++} ++ ++ +diff -urN uClibc/ldso-0.9.24/ldso/sh/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/sh/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/sh/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sh/boot1_arch.h 2002-11-03 08:12:29.000000000 -0600 +@@ -0,0 +1,22 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. */ ++ ++asm("" \ ++" .text\n" \ ++" .globl _dl_boot\n" \ ++"_dl_boot:\n" \ ++" mov r15, r4\n" \ ++" mov.l .L_dl_boot2, r0\n" \ ++" bsrf r0\n" \ ++" add #4, r4\n" \ ++".jmp_loc:\n" \ ++" jmp @r0\n" \ ++" mov #0, r4 !call _start with arg == 0\n" \ ++".L_dl_boot2:\n" \ ++" .long _dl_boot2-.jmp_loc\n" \ ++" .previous\n" \ ++); ++ ++#define _dl_boot _dl_boot2 ++#define LD_BOOT(X) static void * __attribute__ ((unused)) _dl_boot (X) +diff -urN uClibc/ldso-0.9.24/ldso/sh/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/sh/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/sh/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sh/elfinterp.c 2003-09-11 05:26:16.000000000 -0500 +@@ -0,0 +1,427 @@ ++/* vi: set sw=4 ts=4: */ ++/* SuperH ELF shared library loader suppport ++ * ++ * Copyright (C) 2002, Stefan Allius and ++ * Eddie C. Dost ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char *_dl_reltypes_tab[] = ++{ ++ [0] "R_SH_NONE", "R_SH_DIR32", "R_SH_REL32", "R_SH_DIR8WPN", ++ [4] "R_SH_IND12W", "R_SH_DIR8WPL", "R_SH_DIR8WPZ", "R_SH_DIR8BP", ++ [8] "R_SH_DIR8W", "R_SH_DIR8L", ++ [25] "R_SH_SWITCH16","R_SH_SWITCH32","R_SH_USES", ++ [28] "R_SH_COUNT", "R_SH_ALIGN", "R_SH_CODE", "R_SH_DATA", ++ [32] "R_SH_LABEL", "R_SH_SWITCH8", "R_SH_GNU_VTINHERIT","R_SH_GNU_VTENTRY", ++[160] "R_SH_GOT32", "R_SH_PLT32", "R_SH_COPY", "R_SH_GLOB_DAT", ++[164] "R_SH_JMP_SLOT","R_SH_RELATIVE","R_SH_GOTOFF", "R_SH_GOTPC", ++}; ++ ++static const char * ++_dl_reltypes(int type) ++{ ++ static char buf[22]; ++ const char *str; ++ ++ if (type >= (int)(sizeof (_dl_reltypes_tab)/sizeof(_dl_reltypes_tab[0])) || ++ NULL == (str = _dl_reltypes_tab[type])) ++ { ++ str =_dl_simple_ltoa( buf, (unsigned long)(type)); ++ } ++ return str; ++} ++ ++static ++void debug_sym(Elf32_Sym *symtab,char *strtab,int symtab_index) ++{ ++ if(_dl_debug_symbols) ++ { ++ if(symtab_index){ ++ _dl_dprintf(_dl_debug_file, "\n%s\tvalue=%x\tsize=%x\tinfo=%x\tother=%x\tshndx=%x", ++ strtab + symtab[symtab_index].st_name, ++ symtab[symtab_index].st_value, ++ symtab[symtab_index].st_size, ++ symtab[symtab_index].st_info, ++ symtab[symtab_index].st_other, ++ symtab[symtab_index].st_shndx); ++ } ++ } ++} ++ ++static void debug_reloc(Elf32_Sym *symtab,char *strtab, ELF_RELOC *rpnt) ++{ ++ if(_dl_debug_reloc) ++ { ++ int symtab_index; ++ const char *sym; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ sym = symtab_index ? strtab + symtab[symtab_index].st_name : "sym=0x0"; ++ ++ if(_dl_debug_symbols) ++ _dl_dprintf(_dl_debug_file, "\n\t"); ++ else ++ _dl_dprintf(_dl_debug_file, "\n%s\n\t", sym); ++ ++#ifdef ELF_USES_RELOCA ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\taddend=%x", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset, ++ rpnt->r_addend); ++#else ++ _dl_dprintf(_dl_debug_file, "%s\toffset=%x\n", ++ _dl_reltypes(ELF32_R_TYPE(rpnt->r_info)), ++ rpnt->r_offset); ++#endif ++ } ++} ++#endif ++ ++/* Program to load an ELF binary on a linux system, and run it. ++ References to symbols in sharable libraries can be resolved by either ++ an ELF sharable library or a linux style of shared library. */ ++ ++/* Disclaimer: I have never seen any AT&T source code for SVr4, nor have ++ I ever taken any courses on internals. This program was developed using ++ information available through the book "UNIX SYSTEM V RELEASE 4, ++ Programmers guide: Ansi C and Programming Support Tools", which did ++ a more than adequate job of explaining everything required to get this ++ working. */ ++ ++extern int _dl_linux_resolve(void); ++ ++unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) ++{ ++ int reloc_type; ++ ELF_RELOC *this_reloc; ++ char *strtab; ++ Elf32_Sym *symtab; ++ int symtab_index; ++ char *rel_addr; ++ char *new_addr; ++ char **got_addr; ++ unsigned long instr_addr; ++ char *symname; ++ ++ rel_addr = (char *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr); ++ ++ this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry); ++ reloc_type = ELF32_R_TYPE(this_reloc->r_info); ++ symtab_index = ELF32_R_SYM(this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (reloc_type != R_SH_JMP_SLOT) { ++ _dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n", ++ _dl_progname); ++ _dl_exit(1); ++ } ++ ++ /* Address of jump instruction to fix up */ ++ instr_addr = ((unsigned long) this_reloc->r_offset + ++ (unsigned long) tpnt->loadaddr); ++ got_addr = (char **) instr_addr; ++ ++ ++ /* Get the address of the GOT entry */ ++ new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, resolver); ++ if (!new_addr) { ++ new_addr = _dl_find_hash(symname, NULL, NULL, resolver); ++ if (new_addr) { ++ return (unsigned long) new_addr; ++ } ++ ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname); ++ _dl_exit(1); ++ } ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if ((unsigned long) got_addr < 0x20000000) ++ { ++ if (_dl_debug_bindings) ++ { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname); ++ if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, ++ "\n\tpatched %x ==> %x @ %x\n", *got_addr, new_addr, got_addr); ++ } ++ } ++ if (!_dl_debug_nofixups) { ++ *got_addr = new_addr; ++ } ++#else ++ *got_addr = new_addr; ++#endif ++ ++ return (unsigned long) new_addr; ++} ++ ++ ++static int ++_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope, ++ unsigned long rel_addr, unsigned long rel_size, ++ int (*reloc_fnc) (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab)) ++{ ++ unsigned int i; ++ char *strtab; ++ Elf32_Sym *symtab; ++ ELF_RELOC *rpnt; ++ int symtab_index; ++ /* Now parse the relocation information */ ++ ++ rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr); ++ rel_size = rel_size / sizeof(ELF_RELOC); ++ ++ symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for (i = 0; i < rel_size; i++, rpnt++) { ++ int res; ++ ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ ++ /* When the dynamic linker bootstrapped itself, it resolved some symbols. ++ Make sure we do not do them again */ ++ if (!symtab_index && tpnt->libtype == program_interpreter) ++ continue; ++ if (symtab_index && tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ debug_sym(symtab,strtab,symtab_index); ++ debug_reloc(symtab,strtab,rpnt); ++#endif ++ ++ res = reloc_fnc (tpnt, scope, rpnt, symtab, strtab); ++ ++ if (res==0) continue; ++ ++ _dl_dprintf(2, "\n%s: ",_dl_progname); ++ ++ if (symtab_index) ++ _dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name); ++ ++ if (res <0) ++ { ++ int reloc_type = ELF32_R_TYPE(rpnt->r_info); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type)); ++#else ++ _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type); ++#endif ++ _dl_exit(-res); ++ } ++ else if (res >0) ++ { ++ _dl_dprintf(2, "can't resolve symbol\n"); ++ return res; ++ } ++ } ++ return 0; ++} ++ ++ ++static int ++_dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ char *symname; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ ++ ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, ++ (reloc_type == R_SH_JMP_SLOT ? tpnt : NULL), symbolrel); ++ ++ /* ++ * We want to allow undefined references to weak symbols - this might ++ * have been intentional. We should not be linking local symbols ++ * here, so all bases should be covered. ++ */ ++ if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "\tglobal symbol '%s' already defined in '%s'\n", ++ symname, tpnt->libname); ++#endif ++ return 0; ++ } ++ } ++ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_SH_NONE: ++ break; ++ case R_SH_COPY: ++ /* handled later on */ ++ break; ++ case R_SH_DIR32: ++ case R_SH_GLOB_DAT: ++ case R_SH_JMP_SLOT: ++ *reloc_addr = symbol_addr + rpnt->r_addend; ++ break; ++ case R_SH_REL32: ++ *reloc_addr = symbol_addr + rpnt->r_addend - ++ (unsigned long) reloc_addr; ++ break; ++ case R_SH_RELATIVE: ++ *reloc_addr = (unsigned long) tpnt->loadaddr + rpnt->r_addend; ++ break; ++ default: ++ return -1; /*call _dl_exit(1) */ ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ ++ return 0; ++} ++ ++ ++static int ++_dl_do_lazy_reloc (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ unsigned long *reloc_addr; ++#if defined (__SUPPORT_LD_DEBUG__) ++ unsigned long old_val; ++#endif ++ (void)scope; ++ (void)symtab; ++ (void)strtab; ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ old_val = *reloc_addr; ++#endif ++ switch (reloc_type) { ++ case R_SH_NONE: ++ break; ++ case R_SH_JMP_SLOT: ++ *reloc_addr += (unsigned long) tpnt->loadaddr; ++ break; ++ default: ++ return -1; /*call _dl_exit(1) */ ++ } ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_reloc && _dl_debug_detail) ++ _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x", old_val, *reloc_addr, reloc_addr); ++#endif ++ return 0; ++ ++} ++ ++/* This is done as a separate step, because there are cases where ++ information is first copied and later initialized. This results in ++ the wrong information being copied. Someone at Sun was complaining about ++ a bug in the handling of _COPY by SVr4, and this may in fact be what he ++ was talking about. Sigh. */ ++ ++/* No, there are cases where the SVr4 linker fails to emit COPY relocs ++ at all */ ++static int ++_dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope, ++ ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab) ++{ ++ int reloc_type; ++ int symtab_index; ++ unsigned long *reloc_addr; ++ unsigned long symbol_addr; ++ int goof = 0; ++ char*symname; ++ ++ reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ if (reloc_type != R_SH_COPY) ++ return 0; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ symname = strtab + symtab[symtab_index].st_name; ++ ++ if (symtab_index) { ++ ++ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, NULL, copyrel); ++ if (!symbol_addr) goof++; ++ } ++ if (!goof) { ++#if defined (__SUPPORT_LD_DEBUG__) ++ if(_dl_debug_move) ++ _dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x", ++ symname, symtab[symtab_index].st_size, ++ symbol_addr, symtab[symtab_index].st_value); ++#endif ++ _dl_memcpy((char *) symtab[symtab_index].st_value, ++ (char *) symbol_addr, symtab[symtab_index].st_size); ++ } ++ ++ return goof; ++} ++ ++ ++void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void) type; ++ (void)_dl_parse(tpnt, NULL, rel_addr, rel_size, _dl_do_lazy_reloc); ++} ++ ++int _dl_parse_relocation_information(struct elf_resolve *tpnt, ++ unsigned long rel_addr, unsigned long rel_size, int type) ++{ ++ (void) type; ++ return _dl_parse(tpnt, tpnt->symbol_scope, rel_addr, rel_size, _dl_do_reloc); ++} ++ ++int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr, ++ unsigned long rel_size, int type) ++{ ++ (void) type; ++ return _dl_parse(xpnt->dyn, xpnt->next, rel_addr, rel_size, _dl_do_copy); ++} ++ ++ +diff -urN uClibc/ldso-0.9.24/ldso/sh/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/sh/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/sh/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sh/ld_syscalls.h 2002-08-09 07:20:19.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* Define the __set_errno macro as nothing so that we don't bother ++ * setting errno, which is important since we make system calls ++ * before the errno symbol is dynamicly linked. */ ++ ++#define __set_errno(X) {(void)(X);} ++#include "sys/syscall.h" ++ +diff -urN uClibc/ldso-0.9.24/ldso/sh/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/sh/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/sh/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sh/ld_sysdep.h 2002-11-07 20:18:16.000000000 -0600 +@@ -0,0 +1,144 @@ ++/* ++ * Various assmbly language/system dependent hacks that are required ++ * so that we can minimize the amount of platform specific code. ++ */ ++ ++/* ++ * Define this if the system uses RELOCA. ++ */ ++#define ELF_USES_RELOCA ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS) ++ ++/* ++ * Initialization sequence for a GOT. ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++{ \ ++ GOT_BASE[2] = (unsigned long) _dl_linux_resolve; \ ++ GOT_BASE[1] = (unsigned long) (MODULE); \ ++} ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. RELP is the relocation that we ++ * are performing, REL is the pointer to the address we are relocating. ++ * SYMBOL is the symbol involved in the relocation, and LOAD is the ++ * load address. ++ */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ switch(ELF32_R_TYPE((RELP)->r_info)){ \ ++ case R_SH_REL32: \ ++ *(REL) = (SYMBOL) + (RELP)->r_addend \ ++ - (unsigned long)(REL); \ ++ break; \ ++ case R_SH_DIR32: \ ++ case R_SH_GLOB_DAT: \ ++ case R_SH_JMP_SLOT: \ ++ *(REL) = (SYMBOL) + (RELP)->r_addend; \ ++ break; \ ++ case R_SH_RELATIVE: \ ++ *(REL) = (LOAD) + (RELP)->r_addend; \ ++ break; \ ++ case R_SH_NONE: \ ++ break; \ ++ default: \ ++ SEND_STDERR("BOOTSTRAP_RELOC: unhandled reloc type "); \ ++ SEND_NUMBER_STDERR(ELF32_R_TYPE((RELP)->r_info), 1); \ ++ SEND_STDERR("REL, SYMBOL, LOAD: "); \ ++ SEND_ADDRESS_STDERR(REL, 0); \ ++ SEND_STDERR(", "); \ ++ SEND_ADDRESS_STDERR(SYMBOL, 0); \ ++ SEND_STDERR(", "); \ ++ SEND_ADDRESS_STDERR(LOAD, 1); \ ++ _dl_exit(1); \ ++ } ++ ++ ++/* ++ * Transfer control to the user's application, once the dynamic loader ++ * is done. This routine has to exit the current function, then ++ * call the _dl_elf_main function. ++ */ ++ ++#define START() return _dl_elf_main; ++ ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++ ++#define MAGIC1 EM_SH ++#undef MAGIC2 ++/* Used for error messages */ ++#define ELF_TARGET "sh" ++ ++struct elf_resolve; ++extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry); ++ ++static __inline__ unsigned int ++_dl_urem(unsigned int n, unsigned int base) ++{ ++ int res; ++ ++ __asm__ (""\ ++ "mov #0, r0\n\t" \ ++ "div0u\n\t" \ ++ "" \ ++ "! get one bit from the msb of the numerator into the T\n\t" \ ++ "! bit and divide it by whats in %2. Put the answer bit\n\t" \ ++ "! into the T bit so it can come out again at the bottom\n\t" \ ++ "" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1 ; div1 %2, r0\n\t" \ ++ "rotcl %1\n\t" ++ : "=r" (res) ++ : "0" (n), "r" (base) ++ : "r0","cc"); ++ ++ return n - (base * res); ++} ++ ++#define do_rem(result, n, base) ((result) = _dl_urem((n), (base))) ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/sh/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/sh/resolve.S +--- uClibc/ldso-0.9.24/ldso/sh/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sh/resolve.S 2002-11-07 20:18:16.000000000 -0600 +@@ -0,0 +1,91 @@ ++/* ++ * Stolen from glibc-2.2.2 by Eddie C. Dost ++ */ ++ ++ .text ++ .globl _dl_linux_resolver ++ .globl _dl_linux_resolve ++ .type _dl_linux_resolve, @function ++ .balign 16 ++_dl_linux_resolve: ++ mov.l r3, @-r15 ++ mov.l r4, @-r15 ++ mov.l r5, @-r15 ++ mov.l r6, @-r15 ++ mov.l r7, @-r15 ++ mov.l r12, @-r15 ++ movt r3 ! Save T flag ++ mov.l r3, @-r15 ++ ++#ifdef HAVE_FPU ++ sts.l fpscr, @-r15 ++ mov #8,r3 ++ swap.w r3, r3 ++ lds r3, fpscr ++ fmov.s fr11, @-r15 ++ fmov.s fr10, @-r15 ++ fmov.s fr9, @-r15 ++ fmov.s fr8, @-r15 ++ fmov.s fr7, @-r15 ++ fmov.s fr6, @-r15 ++ fmov.s fr5, @-r15 ++ fmov.s fr4, @-r15 ++#endif ++ sts.l pr, @-r15 ++/* Note - The PLT entries have been "optimised" not to use r2. r2 is used by ++ GCC to return the address of large structures, so it should not be ++ corrupted here. This does mean however, that those PLTs does not conform ++ to the SH PIC ABI. That spec says that r0 contains the type of the PLT ++ and r2 contains the GOT id. The GNU Plt version stores the GOT id in r0 and ++ ignores the type. We can easily detect this difference however, ++ since the type will always be 0 or 8, and the GOT ids will always be ++ greater than or equal to 12. ++ ++ Found in binutils/bfd/elf32-sh.c by Stefan Allius ++ */ ++ mov #8 ,r5 ++ cmp/gt r5, r0 ++ bt 1f ++ mov r2, r0 ! link map address in r2 (SH PIC ABI) ++1: ++ mov r0, r4 ! link map address in r0 (GNUs PLT) ++ mova .LG, r0 ++ mov.l .LG, r5 ++ add r5, r0 ++ mov.l 3f, r5 ++ mov.l @(r0, r5),r5 ++ jsr @r5 ++ mov r1, r5 ! Reloc offset ++ ++ lds.l @r15+, pr ! Get register content back ++ ++#ifdef HAVE_FPU ++ fmov.s @r15+, fr4 ++ fmov.s @r15+, fr5 ++ fmov.s @r15+, fr6 ++ fmov.s @r15+, fr7 ++ fmov.s @r15+, fr8 ++ fmov.s @r15+, fr9 ++ fmov.s @r15+, fr10 ++ fmov.s @r15+, fr11 ++ lds.l @r15+, fpscr ++#endif ++ ++ mov.l @r15+, r3 ++ shal r3 ! Load T flag ++ mov.l @r15+, r12 ++ mov.l @r15+, r7 ++ mov.l @r15+, r6 ++ mov.l @r15+, r5 ++ mov.l @r15+, r4 ++ jmp @r0 ! Jump to function address ++ mov.l @r15+, r3 ++ ++ .balign 4 ++ ++3: ++ .long _dl_linux_resolver@GOT ++.LG: ++ .long _GLOBAL_OFFSET_TABLE_ ++ .size _dl_linux_resolve, . - _dl_linux_resolve ++ +diff -urN uClibc/ldso-0.9.24/ldso/sparc/boot1_arch.h uClibc.ldso.24/ldso-0.9.24/ldso/sparc/boot1_arch.h +--- uClibc/ldso-0.9.24/ldso/sparc/boot1_arch.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sparc/boot1_arch.h 2002-08-08 09:35:49.000000000 -0500 +@@ -0,0 +1,7 @@ ++/* Any assmbly language/system dependent hacks needed to setup boot1.c so it ++ * will work as expected and cope with whatever platform specific wierdness is ++ * needed for this architecture. See arm/boot1_arch.h for an example of what ++ * can be done. ++ */ ++ ++#define LD_BOOT(X) void _dl_boot (X) +diff -urN uClibc/ldso-0.9.24/ldso/sparc/elfinterp.c uClibc.ldso.24/ldso-0.9.24/ldso/sparc/elfinterp.c +--- uClibc/ldso-0.9.24/ldso/sparc/elfinterp.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sparc/elfinterp.c 2002-11-05 12:21:12.000000000 -0600 +@@ -0,0 +1,357 @@ ++/* vi: set sw=4 ts=4: */ ++/* sparc ELF shared library loader suppport ++ * ++ * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald, ++ * David Engel, Hongjiu Lu and Mitch D'Souza ++ * ++ * 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. The name of the above contributors may not be ++ * used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS 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 THE CONTRIBUTORS 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. ++ */ ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++static const char * _dl_reltypes[] = { "R_SPARC_NONE", "R_SPARC_8", ++ "R_SPARC_16", "R_SPARC_32", "R_SPARC_DISP8", "R_SPARC_DISP16", ++ "R_SPARC_DISP32", "R_SPARC_WDISP30", "R_SPARC_WDISP22", ++ "R_SPARC_HI22", "R_SPARC_22", "R_SPARC_13", "R_SPARC_LO10", ++ "R_SPARC_GOT10", "R_SPARC_GOT13", "R_SPARC_GOT22", "R_SPARC_PC10", ++ "R_SPARC_PC22", "R_SPARC_WPLT30", "R_SPARC_COPY", ++ "R_SPARC_GLOB_DAT", "R_SPARC_JMP_SLOT", "R_SPARC_RELATIVE", ++ "R_SPARC_UA32"}; ++#endif ++ ++/* Program to load an ELF binary on a linux system, and run it. ++References to symbols in sharable libraries can be resolved by either ++an ELF sharable library or a linux style of shared library. */ ++ ++/* Disclaimer: I have never seen any AT&T source code for SVr4, nor have ++ I ever taken any courses on internals. This program was developed using ++ information available through the book "UNIX SYSTEM V RELEASE 4, ++ Programmers guide: Ansi C and Programming Support Tools", which did ++ a more than adequate job of explaining everything required to get this ++ working. */ ++ ++extern _dl_linux_resolve(void); ++ ++unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt) ++{ ++ int reloc_type; ++ Elf32_Rela * this_reloc; ++ char * strtab; ++ Elf32_Sym * symtab; ++ Elf32_Rela * rel_addr; ++ struct elf_resolve * tpnt; ++ int symtab_index; ++ char * new_addr; ++ char ** got_addr; ++ unsigned int instr_addr; ++ tpnt = (struct elf_resolve *) plt[2]; ++ ++ rel_addr = (Elf32_Rela *) (tpnt->dynamic_info[DT_JMPREL] + ++ tpnt->loadaddr); ++ ++ /* ++ * Generate the correct relocation index into the .rela.plt section. ++ */ ++ reloc_entry = (reloc_entry >> 12) - 0xc; ++ ++ this_reloc = (Elf32_Rela *) ((char *) rel_addr + reloc_entry); ++ ++ reloc_type = ELF32_R_TYPE(this_reloc->r_info); ++ symtab_index = ELF32_R_SYM(this_reloc->r_info); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ _dl_dprintf(2, "tpnt = %x\n", tpnt); ++ _dl_dprintf(2, "reloc = %x\n", this_reloc); ++ _dl_dprintf(2, "symtab = %x\n", symtab); ++ _dl_dprintf(2, "strtab = %x\n", strtab); ++ ++ ++ if (reloc_type != R_SPARC_JMP_SLOT) { ++ _dl_dprintf(2, "%s: incorrect relocation type in jump relocations (%d)\n", ++ _dl_progname, reloc_type); ++ _dl_exit(30); ++ }; ++ ++ /* Address of jump instruction to fix up */ ++ instr_addr = ((int)this_reloc->r_offset + (int)tpnt->loadaddr); ++ got_addr = (char **) instr_addr; ++ ++ _dl_dprintf(2, "symtab_index %d\n", symtab_index); ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if (_dl_debug_symbols) { ++ _dl_dprintf(2, "Resolving symbol %s\n", ++ strtab + symtab[symtab_index].st_name); ++ } ++#endif ++ ++ /* Get the address of the GOT entry */ ++ new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name, ++ tpnt->symbol_scope, tpnt, resolver); ++ if(!new_addr) { ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ _dl_exit(31); ++ }; ++ ++#if defined (__SUPPORT_LD_DEBUG__) ++ if ((unsigned long) got_addr < 0x40000000) ++ { ++ if (_dl_debug_bindings) ++ { ++ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", ++ strtab + symtab[symtab_index].st_name); ++ if(_dl_debug_detail) _dl_dprintf(_dl_debug_file, ++ "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr); ++ } ++ } ++ if (!_dl_debug_nofixups) { ++ got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff)); ++ got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff)); ++ } ++#else ++ got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff)); ++ got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff)); ++#endif ++ ++ _dl_dprintf(2, "Address = %x\n",new_addr); ++ _dl_exit(32); ++ ++ return (unsigned int) new_addr; ++} ++ ++void _dl_parse_lazy_relocation_information(struct elf_resolve * tpnt, int rel_addr, ++ int rel_size, int type){ ++ int i; ++ char * strtab; ++ int reloc_type; ++ int symtab_index; ++ Elf32_Sym * symtab; ++ Elf32_Rela * rpnt; ++ unsigned int * reloc_addr; ++ ++ /* Now parse the relocation information */ ++ rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = ( char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for(i=0; i< rel_size; i += sizeof(Elf32_Rela), rpnt++){ ++ reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ ++ /* When the dynamic linker bootstrapped itself, it resolved some symbols. ++ Make sure we do not do them again */ ++ if(!symtab_index && tpnt->libtype == program_interpreter) continue; ++ if(symtab_index && tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++ switch(reloc_type){ ++ case R_SPARC_NONE: ++ break; ++ case R_SPARC_JMP_SLOT: ++ break; ++ default: ++ _dl_dprintf(2, "%s: (LAZY) can't handle reloc type ", _dl_progname); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); ++#endif ++ if(symtab_index) _dl_dprintf(2, "'%s'\n", ++ strtab + symtab[symtab_index].st_name); ++ _dl_exit(33); ++ }; ++ }; ++} ++ ++int _dl_parse_relocation_information(struct elf_resolve * tpnt, int rel_addr, ++ int rel_size, int type){ ++ int i; ++ char * strtab; ++ int reloc_type; ++ int goof = 0; ++ Elf32_Sym * symtab; ++ Elf32_Rela * rpnt; ++ unsigned int * reloc_addr; ++ unsigned int symbol_addr; ++ int symtab_index; ++ /* Now parse the relocation information */ ++ ++ rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = ( char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for(i=0; i< rel_size; i+= sizeof(Elf32_Rela), rpnt++){ ++ reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ ++ if(!symtab_index && tpnt->libtype == program_interpreter) continue; ++ ++ if(symtab_index) { ++ ++ if(tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++ symbol_addr = (unsigned int) ++ _dl_find_hash(strtab + symtab[symtab_index].st_name, ++ tpnt->symbol_scope, ++ (reloc_type == R_SPARC_JMP_SLOT ? tpnt : NULL), symbolrel); ++ ++ if(!symbol_addr && ++ ELF32_ST_BIND(symtab [symtab_index].st_info) == STB_GLOBAL) { ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ goof++; ++ }; ++ }; ++ switch(reloc_type){ ++ case R_SPARC_NONE: ++ break; ++ case R_SPARC_32: ++ *reloc_addr = symbol_addr + rpnt->r_addend; ++ break; ++ case R_SPARC_DISP32: ++ *reloc_addr = symbol_addr + rpnt->r_addend - (unsigned int) reloc_addr; ++ break; ++ case R_SPARC_GLOB_DAT: ++ *reloc_addr = symbol_addr + rpnt->r_addend; ++ break; ++ case R_SPARC_JMP_SLOT: ++ reloc_addr[1] = 0x03000000 | ((symbol_addr >> 10) & 0x3fffff); ++ reloc_addr[2] = 0x81c06000 | (symbol_addr & 0x3ff); ++ break; ++ case R_SPARC_RELATIVE: ++ *reloc_addr += (unsigned int) tpnt->loadaddr + rpnt->r_addend; ++ break; ++ case R_SPARC_HI22: ++ if (!symbol_addr) ++ symbol_addr = tpnt->loadaddr + rpnt->r_addend; ++ else ++ symbol_addr += rpnt->r_addend; ++ *reloc_addr = (*reloc_addr & 0xffc00000)|(symbol_addr >> 10); ++ break; ++ case R_SPARC_LO10: ++ if (!symbol_addr) ++ symbol_addr = tpnt->loadaddr + rpnt->r_addend; ++ else ++ symbol_addr += rpnt->r_addend; ++ *reloc_addr = (*reloc_addr & ~0x3ff)|(symbol_addr & 0x3ff); ++ break; ++ case R_SPARC_WDISP30: ++ *reloc_addr = (*reloc_addr & 0xc0000000)| ++ ((symbol_addr - (unsigned int) reloc_addr) >> 2); ++ break; ++ case R_SPARC_COPY: ++#if 0 /* This one is done later */ ++ _dl_dprintf(2, "Doing copy for symbol "); ++ if(symtab_index) _dl_dprintf(2, strtab + symtab[symtab_index].st_name); ++ _dl_dprintf(2, "\n"); ++ _dl_memcpy((void *) symtab[symtab_index].st_value, ++ (void *) symbol_addr, ++ symtab[symtab_index].st_size); ++#endif ++ break; ++ default: ++ _dl_dprintf(2, "%s: can't handle reloc type ", _dl_progname); ++#if defined (__SUPPORT_LD_DEBUG__) ++ _dl_dprintf(2, "%s ", _dl_reltypes[reloc_type]); ++#endif ++ if (symtab_index) ++ _dl_dprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name); ++ _dl_exit(34); ++ }; ++ ++ }; ++ return goof; ++} ++ ++ ++/* This is done as a separate step, because there are cases where ++ information is first copied and later initialized. This results in ++ the wrong information being copied. Someone at Sun was complaining about ++ a bug in the handling of _COPY by SVr4, and this may in fact be what he ++ was talking about. Sigh. */ ++ ++/* No, there are cases where the SVr4 linker fails to emit COPY relocs ++ at all */ ++ ++int _dl_parse_copy_information(struct dyn_elf * xpnt, int rel_addr, ++ int rel_size, int type) ++{ ++ int i; ++ char * strtab; ++ int reloc_type; ++ int goof = 0; ++ Elf32_Sym * symtab; ++ Elf32_Rela * rpnt; ++ unsigned int * reloc_addr; ++ unsigned int symbol_addr; ++ struct elf_resolve *tpnt; ++ int symtab_index; ++ /* Now parse the relocation information */ ++ ++ tpnt = xpnt->dyn; ++ ++ rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); ++ ++ symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr); ++ strtab = ( char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); ++ ++ for(i=0; i< rel_size; i+= sizeof(Elf32_Rela), rpnt++){ ++ reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset); ++ reloc_type = ELF32_R_TYPE(rpnt->r_info); ++ if(reloc_type != R_SPARC_COPY) continue; ++ symtab_index = ELF32_R_SYM(rpnt->r_info); ++ symbol_addr = 0; ++ if(!symtab_index && tpnt->libtype == program_interpreter) continue; ++ if(symtab_index) { ++ ++ if(tpnt->libtype == program_interpreter && ++ _dl_symbol(strtab + symtab[symtab_index].st_name)) ++ continue; ++ ++ symbol_addr = (unsigned int) ++ _dl_find_hash(strtab + symtab[symtab_index].st_name, ++ xpnt->next, NULL, copyrel); ++ if(!symbol_addr) { ++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", ++ _dl_progname, strtab + symtab[symtab_index].st_name); ++ goof++; ++ }; ++ }; ++ if (!goof) ++ _dl_memcpy((char *) symtab[symtab_index].st_value, ++ (char *) symbol_addr, ++ symtab[symtab_index].st_size); ++ }; ++ return goof; ++} ++ ++ +diff -urN uClibc/ldso-0.9.24/ldso/sparc/ld_syscalls.h uClibc.ldso.24/ldso-0.9.24/ldso/sparc/ld_syscalls.h +--- uClibc/ldso-0.9.24/ldso/sparc/ld_syscalls.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sparc/ld_syscalls.h 2002-03-19 04:43:35.000000000 -0600 +@@ -0,0 +1,155 @@ ++/* ++ * This file contains the system call macros and syscall ++ * numbers used by the shared library loader. ++ */ ++ ++#define __NR_exit 1 ++#define __NR_read 3 ++#define __NR_write 4 ++#define __NR_open 5 ++#define __NR_close 6 ++#define __NR_getuid 24 ++#define __NR_getgid 47 ++#define __NR_geteuid 49 ++#define __NR_getegid 50 ++#define __NR_readlink 58 ++#define __NR_mmap 71 ++#define __NR_munmap 73 ++#define __NR_stat 38 ++#define __NR_mprotect 74 ++ ++/* Here are the macros which define how this platform makes ++ * system calls. This particular variant does _not_ set ++ * errno (note how it is disabled in __syscall_return) since ++ * these will get called before the errno symbol is dynamicly ++ * linked. */ ++ ++#define _syscall0(type,name) \ ++type name(void) \ ++{ \ ++long __res; \ ++register long __g1 __asm__ ("g1") = __NR_##name; \ ++__asm__ __volatile__ ("t 0x10\n\t" \ ++ "bcc 1f\n\t" \ ++ "mov %%o0, %0\n\t" \ ++ "sub %%g0, %%o0, %0\n\t" \ ++ "1:\n\t" \ ++ : "=r" (__res)\ ++ : "r" (__g1) \ ++ : "o0", "cc"); \ ++if (__res < -255 || __res >= 0) \ ++ return (type) __res; \ ++/*errno = -__res; */\ ++return -1; \ ++} ++ ++#define _syscall1(type,name,type1,arg1) \ ++type name(type1 arg1) \ ++{ \ ++long __res; \ ++register long __g1 __asm__ ("g1") = __NR_##name; \ ++register long __o0 __asm__ ("o0") = (long)(arg1); \ ++__asm__ __volatile__ ("t 0x10\n\t" \ ++ "bcc 1f\n\t" \ ++ "mov %%o0, %0\n\t" \ ++ "sub %%g0, %%o0, %0\n\t" \ ++ "1:\n\t" \ ++ : "=r" (__res), "=&r" (__o0) \ ++ : "1" (__o0), "r" (__g1) \ ++ : "cc"); \ ++if (__res < -255 || __res >= 0) \ ++ return (type) __res; \ ++/*errno = -__res;*/ \ ++return -1; \ ++} ++ ++#define _syscall2(type,name,type1,arg1,type2,arg2) \ ++type name(type1 arg1,type2 arg2) \ ++{ \ ++long __res; \ ++register long __g1 __asm__ ("g1") = __NR_##name; \ ++register long __o0 __asm__ ("o0") = (long)(arg1); \ ++register long __o1 __asm__ ("o1") = (long)(arg2); \ ++__asm__ __volatile__ ("t 0x10\n\t" \ ++ "bcc 1f\n\t" \ ++ "mov %%o0, %0\n\t" \ ++ "sub %%g0, %%o0, %0\n\t" \ ++ "1:\n\t" \ ++ : "=r" (__res), "=&r" (__o0) \ ++ : "1" (__o0), "r" (__o1), "r" (__g1) \ ++ : "cc"); \ ++if (__res < -255 || __res >= 0) \ ++ return (type) __res; \ ++/*errno = -__res;*/ \ ++return -1; \ ++} ++ ++#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ ++type name(type1 arg1,type2 arg2,type3 arg3) \ ++{ \ ++long __res; \ ++register long __g1 __asm__ ("g1") = __NR_##name; \ ++register long __o0 __asm__ ("o0") = (long)(arg1); \ ++register long __o1 __asm__ ("o1") = (long)(arg2); \ ++register long __o2 __asm__ ("o2") = (long)(arg3); \ ++__asm__ __volatile__ ("t 0x10\n\t" \ ++ "bcc 1f\n\t" \ ++ "mov %%o0, %0\n\t" \ ++ "sub %%g0, %%o0, %0\n\t" \ ++ "1:\n\t" \ ++ : "=r" (__res), "=&r" (__o0) \ ++ : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \ ++ : "cc"); \ ++if (__res < -255 || __res>=0) \ ++ return (type) __res; \ ++/*errno = -__res;*/ \ ++return -1; \ ++} ++ ++#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ ++type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ ++{ \ ++long __res; \ ++register long __g1 __asm__ ("g1") = __NR_##name; \ ++register long __o0 __asm__ ("o0") = (long)(arg1); \ ++register long __o1 __asm__ ("o1") = (long)(arg2); \ ++register long __o2 __asm__ ("o2") = (long)(arg3); \ ++register long __o3 __asm__ ("o3") = (long)(arg4); \ ++__asm__ __volatile__ ("t 0x10\n\t" \ ++ "bcc 1f\n\t" \ ++ "mov %%o0, %0\n\t" \ ++ "sub %%g0, %%o0, %0\n\t" \ ++ "1:\n\t" \ ++ : "=r" (__res), "=&r" (__o0) \ ++ : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \ ++ : "cc"); \ ++if (__res < -255 || __res>=0) \ ++ return (type) __res; \ ++/*errno = -__res;*/ \ ++return -1; \ ++} ++ ++#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ ++ type5,arg5) \ ++type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ ++{ \ ++long __res; \ ++register long __g1 __asm__ ("g1") = __NR_##name; \ ++register long __o0 __asm__ ("o0") = (long)(arg1); \ ++register long __o1 __asm__ ("o1") = (long)(arg2); \ ++register long __o2 __asm__ ("o2") = (long)(arg3); \ ++register long __o3 __asm__ ("o3") = (long)(arg4); \ ++register long __o4 __asm__ ("o4") = (long)(arg5); \ ++__asm__ __volatile__ ("t 0x10\n\t" \ ++ "bcc 1f\n\t" \ ++ "mov %%o0, %0\n\t" \ ++ "sub %%g0, %%o0, %0\n\t" \ ++ "1:\n\t" \ ++ : "=r" (__res), "=&r" (__o0) \ ++ : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__g1) \ ++ : "cc"); \ ++if (__res < -255 || __res>=0) \ ++ return (type) __res; \ ++/*errno = -__res; */\ ++return -1; \ ++} +diff -urN uClibc/ldso-0.9.24/ldso/sparc/ld_sysdep.h uClibc.ldso.24/ldso-0.9.24/ldso/sparc/ld_sysdep.h +--- uClibc/ldso-0.9.24/ldso/sparc/ld_sysdep.h 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sparc/ld_sysdep.h 2002-08-09 08:05:29.000000000 -0500 +@@ -0,0 +1,112 @@ ++ ++/* ++ * Various assmbly language/system dependent hacks that are required ++ * so that we can minimize the amount of platform specific code. ++ */ ++#define LINUXBIN ++ ++/* ++ * Define this if the system uses RELOCA. ++ */ ++#define ELF_USES_RELOCA ++ ++/* ++ * Get a pointer to the argv array. On many platforms this can be just ++ * the address if the first argument, on other platforms we need to ++ * do something a little more subtle here. We assume that argc is stored ++ * at the word just below the argvp that we return here. ++ */ ++#define GET_ARGV(ARGVP, ARGS) __asm__("\tadd %%fp,68,%0\n" : "=r" (ARGVP)); ++ ++/* ++ * Initialization sequence for a GOT. For the Sparc, this points to the ++ * PLT, and we need to initialize a couple of the slots. The PLT should ++ * look like: ++ * ++ * save %sp, -64, %sp ++ * call _dl_linux_resolve ++ * nop ++ * .word implementation_dependent ++ */ ++#define INIT_GOT(GOT_BASE,MODULE) \ ++{ \ ++ GOT_BASE[0] = 0x9de3bfc0; /* save %sp, -64, %sp */ \ ++ GOT_BASE[1] = 0x40000000 | (((unsigned int) _dl_linux_resolve - (unsigned int) GOT_BASE - 4) >> 2); \ ++ GOT_BASE[2] = 0x01000000; /* nop */ \ ++ GOT_BASE[3] = (int) MODULE; \ ++} ++ ++/* ++ * Here is a macro to perform a relocation. This is only used when ++ * bootstrapping the dynamic loader. ++ */ ++#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD) \ ++ switch(ELF32_R_TYPE((RELP)->r_info)) { \ ++ case R_SPARC_32: \ ++ *REL = SYMBOL + (RELP)->r_addend; \ ++ break; \ ++ case R_SPARC_GLOB_DAT: \ ++ *REL = SYMBOL + (RELP)->r_addend; \ ++ break; \ ++ case R_SPARC_JMP_SLOT: \ ++ REL[1] = 0x03000000 | ((SYMBOL >> 10) & 0x3fffff); \ ++ REL[2] = 0x81c06000 | (SYMBOL & 0x3ff); \ ++ break; \ ++ case R_SPARC_NONE: \ ++ break; \ ++ case R_SPARC_WDISP30: \ ++ break; \ ++ case R_SPARC_RELATIVE: \ ++ *REL += (unsigned int) LOAD + (RELP)->r_addend; \ ++ break; \ ++ default: \ ++ _dl_exit(1); \ ++ } ++ ++ ++/* ++ * Transfer control to the user's application, once the dynamic loader ++ * is done. The crt calls atexit with $g1 if not null, so we need to ++ * ensure that it contains NULL. ++ */ ++ ++#define START() \ ++ __asm__ volatile ( \ ++ "add %%g0,%%g0,%%g1\n\t" \ ++ "jmpl %0, %%o7\n\t" \ ++ "restore %%g0,%%g0,%%g0\n\t" \ ++ : /*"=r" (status) */ : \ ++ "r" (_dl_elf_main): "g1", "o0", "o1") ++ ++ ++ ++/* Here we define the magic numbers that this dynamic loader should accept */ ++ ++#define MAGIC1 EM_SPARC ++#undef MAGIC2 ++/* Used for error messages */ ++#define ELF_TARGET "Sparc" ++ ++#ifndef COMPILE_ASM ++extern unsigned int _dl_linux_resolver(unsigned int reloc_entry, ++ unsigned int * i); ++#endif ++ ++/* ++ * Define this if you want a dynamic loader that works on Solaris. ++ */ ++#define SOLARIS_COMPATIBLE ++ ++#define do_rem(result, n, base) result = (n % base) ++ ++/* ++ * dbx wants the binder to have a specific name. Mustn't disappoint it. ++ */ ++#ifdef SOLARIS_COMPATIBLE ++#define _dl_linux_resolve _elf_rtbndr ++#endif ++ ++/* 4096 bytes alignment */ ++#define PAGE_ALIGN 0xfffff000 ++#define ADDR_ALIGN 0xfff ++#define OFFS_ALIGN 0x7ffff000 +diff -urN uClibc/ldso-0.9.24/ldso/sparc/resolve.S uClibc.ldso.24/ldso-0.9.24/ldso/sparc/resolve.S +--- uClibc/ldso-0.9.24/ldso/sparc/resolve.S 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/ldso/sparc/resolve.S 2002-01-11 13:57:41.000000000 -0600 +@@ -0,0 +1,25 @@ ++/* ++ * These are various helper routines that are needed to run an ELF image. ++ */ ++#define COMPILE_ASM ++#include "ld_sysdep.h" ++ ++.text ++ .align 16 ++ ++.globl _dl_linux_resolve ++_dl_linux_resolve: ++ /* ++ * Call the resolver - pass the address of the PLT so that we can ++ * figure out which module we are in. ++ */ ++ mov %o7,%o1 ++ call _dl_linux_resolver ++ mov %g1,%o0 ++ ++ jmpl %o0,%o7 ++ restore ++.LFE2: ++ ++ .type _dl_linux_resolve,#function ++ .size _dl_linux_resolve,.LFE2-_dl_linux_resolve +diff -urN uClibc/ldso-0.9.24/libdl/.cvsignore uClibc.ldso.24/ldso-0.9.24/libdl/.cvsignore +--- uClibc/ldso-0.9.24/libdl/.cvsignore 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/libdl/.cvsignore 2001-04-26 11:12:47.000000000 -0500 +@@ -0,0 +1,2 @@ ++libdl.so* ++ +diff -urN uClibc/ldso-0.9.24/libdl/Makefile uClibc.ldso.24/ldso-0.9.24/libdl/Makefile +--- uClibc/ldso-0.9.24/libdl/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/libdl/Makefile 2004-03-01 03:05:53.000000000 -0600 +@@ -0,0 +1,86 @@ ++# Makefile for uClibc ++# ++# Copyright (C) 2000 by Lineo, inc. ++# Copyright (C) 2000-2002 Erik Andersen ++# ++# This program is free software; you can redistribute it and/or modify it under ++# the terms of the GNU Library 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 Library General Public License for more ++# details. ++# ++# You should have received a copy of the GNU Library 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 ++ ++ ++TOPDIR=../../ ++include $(TOPDIR)Rules.mak ++ ++XXFLAGS=$(XWARNINGS) $(OPTIMIZATION) $(XARCH_CFLAGS) $(CPU_CFLAGS) \ ++ -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \ ++ -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)ldso-0.9.24/include -I. -I$(TOPDIR)include ++ ++ifeq ($(DODEBUG),y) ++XXFLAGS=$(XWARNINGS) -O0 -g3 $(XARCH_CFLAGS) $(CPU_CFLAGS) \ ++ -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \ ++ -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)ldso-0.9.24/include -I. -I$(TOPDIR)include ++endif ++ ++XXFLAGS+=$(shell $(CC) -print-search-dirs | sed -ne "s/install: *\(.*\)/-I\1include/gp") ++XXFLAGS_NOPIC:=$(XXFLAGS) ++ifeq ($(DOPIC),y) ++ XXFLAGS += $(PICFLAG) -D__LIBDL_SHARED__ ++endif ++ifeq ($(strip $(SUPPORT_LD_DEBUG)),y) ++XXFLAGS+=-D__SUPPORT_LD_DEBUG__ ++endif ++ ++LIBDL=libdl.a ++LIBDL_PIC=libdl_pic.a ++LIBDL_SHARED=libdl.so ++LIBDL_SHARED_FULLNAME=libdl-$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL).so ++ ++CSRC=dlib.c ++OBJS=dlib.o ++PIC_OBJS=dlib_pic.o ++ ++all: $(OBJS) $(LIBDL) shared ++ ++$(LIBDL): ar-target ++ ++ar-target: $(OBJS) $(PIC_OBJS) ++ $(AR) $(ARFLAGS) $(LIBDL) ../ldso/$(TARGET_ARCH)/resolve.o $(OBJS) ++ $(AR) $(ARFLAGS) $(LIBDL_PIC) $(PIC_OBJS) ++ $(INSTALL) -d $(TOPDIR)lib ++ $(RM) $(TOPDIR)lib/$(LIBDL) ++ $(INSTALL) -m 644 $(LIBDL) $(TOPDIR)lib ++ ++ ++dlib.o: dlib.c ++ $(CC) $(XXFLAGS_NOPIC) -c dlib.c -o dlib.o ++ $(STRIPTOOL) -x -R .note -R .comment $*.o ++ ++dlib_pic.o: dlib.c ++ $(CC) $(XXFLAGS) -c dlib.c -o dlib_pic.o ++ $(STRIPTOOL) -x -R .note -R .comment $*.o ++ ++$(OBJ): Makefile ++ ++shared: ++ $(LD) $(LDFLAGS) -soname=$(LIBDL_SHARED).$(MAJOR_VERSION) \ ++ -o $(LIBDL_SHARED_FULLNAME) --whole-archive $(LIBDL_PIC) \ ++ --no-whole-archive $(TOPDIR)/libc/misc/internals/interp.o \ ++ -L$(TOPDIR)/lib -lc $(LDADD_LIBFLOAT) $(LIBGCC); ++ $(INSTALL) -d $(TOPDIR)lib ++ $(RM) $(TOPDIR)lib/$(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBDL_SHARED).$(MAJOR_VERSION) ++ $(INSTALL) -m 644 $(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib ++ $(LN) -sf $(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBDL_SHARED) ++ $(LN) -sf $(LIBDL_SHARED_FULLNAME) $(TOPDIR)lib/$(LIBDL_SHARED).$(MAJOR_VERSION) ++ ++clean: ++ $(RM) .depend $(LIBDL_SHARED)* $(LIBDL_SHARED_FULLNAME) core *.o *.a *.s *.i tmp_make foo *~ +diff -urN uClibc/ldso-0.9.24/libdl/dlib.c uClibc.ldso.24/ldso-0.9.24/libdl/dlib.c +--- uClibc/ldso-0.9.24/libdl/dlib.c 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/libdl/dlib.c 2004-03-01 03:04:42.000000000 -0600 +@@ -0,0 +1,664 @@ ++/* ++ * libdl.c ++ * ++ * Functions required for dlopen et. al. ++ */ ++ ++#include ++ ++ ++/* The public interfaces */ ++void *dlopen(const char *, int) __attribute__ ((__weak__, __alias__ ("_dlopen"))); ++int dlclose(void *) __attribute__ ((__weak__, __alias__ ("_dlclose"))); ++void *dlsym(void *, const char *) __attribute__ ((__weak__, __alias__ ("_dlsym"))); ++const char *dlerror(void) __attribute__ ((__weak__, __alias__ ("_dlerror"))); ++int dladdr(void *, Dl_info *) __attribute__ ((__weak__, __alias__ ("_dladdr"))); ++void _dlinfo(void); ++ ++ ++#ifdef __LIBDL_SHARED__ ++/* This is a real hack. We need access to the dynamic linker, but we ++also need to make it possible to link against this library without any ++unresolved externals. We provide these weak symbols to make the link ++possible, but at run time the normal symbols are accessed. */ ++static void __attribute__ ((unused)) foobar(void) ++{ ++ const char msg[]="libdl library not correctly linked\n"; ++ _dl_write(2, msg, _dl_strlen(msg)); ++ _dl_exit(1); ++} ++ ++static int __attribute__ ((unused)) foobar1 = (int) foobar; /* Use as pointer */ ++extern void _dl_dprintf(int, const char *, ...) __attribute__ ((__weak__, __alias__ ("foobar"))); ++extern char *_dl_find_hash(const char *, struct dyn_elf *, struct elf_resolve *, enum caller_type) ++ __attribute__ ((__weak__, __alias__ ("foobar"))); ++extern struct elf_resolve * _dl_load_shared_library(int, struct dyn_elf **, struct elf_resolve *, char *) ++ __attribute__ ((__weak__, __alias__ ("foobar"))); ++extern struct elf_resolve * _dl_check_if_named_library_is_loaded(const char *full_libname) ++ __attribute__ ((__weak__, __alias__ ("foobar"))); ++extern int _dl_fixup(struct elf_resolve *tpnt, int lazy) ++ __attribute__ ((__weak__, __alias__ ("foobar"))); ++extern int _dl_copy_fixups(struct dyn_elf * tpnt) ++ __attribute__ ((__weak__, __alias__ ("foobar"))); ++#ifdef __mips__ ++extern void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt) ++ __attribute__ ((__weak__, __alias__ ("foobar"))); ++#endif ++#ifdef USE_CACHE ++int _dl_map_cache(void) __attribute__ ((__weak__, __alias__ ("foobar"))); ++int _dl_unmap_cache(void) __attribute__ ((__weak__, __alias__ ("foobar"))); ++#endif ++ ++extern struct dyn_elf *_dl_symbol_tables __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern struct dyn_elf *_dl_handles __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern struct elf_resolve *_dl_loaded_modules __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern struct r_debug *_dl_debug_addr __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern unsigned long _dl_error_number __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern void *(*_dl_malloc_function)(size_t) __attribute__ ((__weak__, __alias__ ("foobar1"))); ++#ifdef __SUPPORT_LD_DEBUG__ ++extern char *_dl_debug __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern char *_dl_debug_symbols __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern char *_dl_debug_move __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern char *_dl_debug_reloc __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern char *_dl_debug_detail __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern char *_dl_debug_nofixups __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern char *_dl_debug_bindings __attribute__ ((__weak__, __alias__ ("foobar1"))); ++extern int _dl_debug_file __attribute__ ((__weak__, __alias__ ("foobar1"))); ++#endif ++ ++#else /* __LIBDL_SHARED__ */ ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++char *_dl_debug = 0; ++char *_dl_debug_symbols = 0; ++char *_dl_debug_move = 0; ++char *_dl_debug_reloc = 0; ++char *_dl_debug_detail = 0; ++char *_dl_debug_nofixups = 0; ++char *_dl_debug_bindings = 0; ++int _dl_debug_file = 2; ++#endif ++char *_dl_library_path = 0; ++char *_dl_ldsopath = 0; ++struct r_debug *_dl_debug_addr = NULL; ++static char *_dl_malloc_addr, *_dl_mmap_zero; ++#include "../ldso/_dl_progname.h" /* Pull in the name of ld.so */ ++#include "../ldso/hash.c" ++#define _dl_trace_loaded_objects 0 ++#include "../ldso/readelflib1.c" ++void *(*_dl_malloc_function) (size_t size); ++int _dl_fixup(struct elf_resolve *tpnt, int lazy); ++#endif ++ ++static int do_dlclose(void *, int need_fini); ++ ++ ++static const char *dl_error_names[] = { ++ "", ++ "File not found", ++ "Unable to open /dev/zero", ++ "Not an ELF file", ++#if defined (__i386__) ++ "Not i386 binary", ++#elif defined (__sparc__) ++ "Not sparc binary", ++#elif defined (__mc68000__) ++ "Not m68k binary", ++#else ++ "Unrecognized binary type", ++#endif ++ "Not an ELF shared library", ++ "Unable to mmap file", ++ "No dynamic section", ++#ifdef ELF_USES_RELOCA ++ "Unable to process REL relocs", ++#else ++ "Unable to process RELA relocs", ++#endif ++ "Bad handle", ++ "Unable to resolve symbol" ++}; ++ ++static void __attribute__ ((destructor)) dl_cleanup(void) ++{ ++ struct dyn_elf *d; ++ ++ for (d = _dl_handles; d; d = d->next_handle) ++ if (d->dyn->libtype == loaded_file && d->dyn->dynamic_info[DT_FINI]) { ++ (* ((int (*)(void)) (d->dyn->loadaddr + d->dyn->dynamic_info[DT_FINI]))) (); ++ d->dyn->dynamic_info[DT_FINI] = 0; ++ } ++} ++ ++void *_dlopen(const char *libname, int flag) ++{ ++ struct elf_resolve *tpnt, *tfrom, *tcurr; ++ struct dyn_elf *dyn_chain, *rpnt = NULL; ++ struct dyn_elf *dpnt; ++ static int dl_init = 0; ++ ElfW(Addr) from; ++ struct elf_resolve *tpnt1; ++ void (*dl_brk) (void); ++ ++ /* A bit of sanity checking... */ ++ if (!(flag & (RTLD_LAZY|RTLD_NOW))) { ++ _dl_error_number = LD_BAD_HANDLE; ++ return NULL; ++ } ++ ++ from = (ElfW(Addr)) __builtin_return_address(0); ++ ++ /* Have the dynamic linker use the regular malloc function now */ ++ if (!dl_init) { ++ dl_init++; ++ _dl_malloc_function = malloc; ++ } ++ ++ /* Cover the trivial case first */ ++ if (!libname) ++ return _dl_symbol_tables; ++ ++ _dl_map_cache(); ++ ++ /* ++ * Try and locate the module we were called from - we ++ * need this so that we get the correct RPATH. Note that ++ * this is the current behavior under Solaris, but the ++ * ABI+ specifies that we should only use the RPATH from ++ * the application. Thus this may go away at some time ++ * in the future. ++ */ ++ tfrom = NULL; ++ for (dpnt = _dl_symbol_tables; dpnt; dpnt = dpnt->next) { ++ tpnt = dpnt->dyn; ++ if (tpnt->loadaddr < from ++ && (tfrom == NULL || tfrom->loadaddr < tpnt->loadaddr)) ++ tfrom = tpnt; ++ } ++ ++ /* Try to load the specified library */ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(_dl_debug_file, "Trying to dlopen '%s'\n", (char*)libname); ++#endif ++ tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname); ++ if (tpnt == NULL) { ++ _dl_unmap_cache(); ++ return NULL; ++ } ++ ++ dyn_chain = (struct dyn_elf *) malloc(sizeof(struct dyn_elf)); ++ _dl_memset(dyn_chain, 0, sizeof(struct dyn_elf)); ++ dyn_chain->dyn = tpnt; ++ dyn_chain->flags = flag; ++ if (!tpnt->symbol_scope) ++ tpnt->symbol_scope = dyn_chain; ++ ++ dyn_chain->next_handle = _dl_handles; ++ _dl_handles = rpnt = dyn_chain; ++ ++ if (tpnt->init_flag & INIT_FUNCS_CALLED) { ++ /* If the init and fini stuff has already been run, that means ++ * the dlopen'd library has already been loaded, and nothing ++ * further needs to be done. */ ++ return (void *) dyn_chain; ++ } ++ ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(_dl_debug_file, "Looking for needed libraries\n"); ++#endif ++ ++ for (tcurr = tpnt; tcurr; tcurr = tcurr->next) ++ { ++ Elf32_Dyn *dpnt; ++ char *lpntstr; ++ for (dpnt = (Elf32_Dyn *) tcurr->dynamic_addr; dpnt->d_tag; dpnt++) { ++ if (dpnt->d_tag == DT_NEEDED) { ++ ++ char *name; ++ lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] + ++ dpnt->d_un.d_val); ++ name = _dl_get_last_path_component(lpntstr); ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(_dl_debug_file, "Trying to load '%s', needed by '%s'\n", ++ lpntstr, tcurr->libname); ++#endif ++ ++ if (!(tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr))) { ++ goto oops; ++ } ++ ++#if 1 ++//FIXME: Enabling this is _so_ wrong.... ++ /* We need global symbol resolution for everything ++ * in the dependent chain */ ++ dyn_chain->flags |= RTLD_GLOBAL; ++#endif ++ ++ rpnt->next = (struct dyn_elf *) malloc(sizeof(struct dyn_elf)); ++ _dl_memset (rpnt->next, 0, sizeof (struct dyn_elf)); ++ rpnt = rpnt->next; ++ if (!tpnt1->symbol_scope) tpnt1->symbol_scope = rpnt; ++ rpnt->dyn = tpnt1; ++ ++ } ++ } ++ } ++ ++ /* ++ * OK, now attach the entire chain at the end ++ */ ++ rpnt->next = _dl_symbol_tables; ++ ++#ifdef __mips__ ++ /* ++ * Relocation of the GOT entries for MIPS have to be done ++ * after all the libraries have been loaded. ++ */ ++ _dl_perform_mips_global_got_relocations(tpnt); ++#endif ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(_dl_debug_file, "Beginning dlopen relocation fixups\n"); ++#endif ++ /* ++ * OK, now all of the kids are tucked into bed in their proper addresses. ++ * Now we go through and look for REL and RELA records that indicate fixups ++ * to the GOT tables. We need to do this in reverse order so that COPY ++ * directives work correctly */ ++ if (_dl_fixup(dyn_chain->dyn, dyn_chain->flags)) ++ goto oops; ++ ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(_dl_debug_file, "Beginning dlopen copy fixups\n"); ++#endif ++ if (_dl_symbol_tables) { ++ if (_dl_copy_fixups(dyn_chain)) ++ goto oops; ++ } ++ ++ ++ /* TODO: Should we set the protections of all pages back to R/O now ? */ ++ ++ ++ /* Notify the debugger we have added some objects. */ ++ _dl_debug_addr->r_state = RT_ADD; ++ if (_dl_debug_addr) { ++ dl_brk = (void (*)(void)) _dl_debug_addr->r_brk; ++ if (dl_brk != NULL) { ++ _dl_debug_addr->r_state = RT_ADD; ++ (*dl_brk) (); ++ ++ _dl_debug_addr->r_state = RT_CONSISTENT; ++ (*dl_brk) (); ++ } ++ } ++ ++#if 0 //def __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dlinfo(); ++#endif ++ ++#ifdef __LIBDL_SHARED__ ++ /* Find the last library so we can run things in the right order */ ++ for (tpnt = dyn_chain->dyn; tpnt->next!=NULL; tpnt = tpnt->next) ++ ; ++ ++ /* Run the ctors and set up the dtors */ ++ for (; tpnt != dyn_chain->dyn->prev; tpnt=tpnt->prev) ++ { ++ /* Apparently crt1 for the application is responsible for handling this. ++ * We only need to run the init/fini for shared libraries ++ */ ++ if (tpnt->libtype == program_interpreter) ++ continue; ++ if (tpnt->libtype == elf_executable) ++ continue; ++ if (tpnt->init_flag & INIT_FUNCS_CALLED) ++ continue; ++ tpnt->init_flag |= INIT_FUNCS_CALLED; ++ ++ if (tpnt->dynamic_info[DT_INIT]) { ++ void (*dl_elf_func) (void); ++ dl_elf_func = (void (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]); ++ if (dl_elf_func && *dl_elf_func != NULL) { ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(2, "running ctors for library %s at '%x'\n", tpnt->libname, dl_elf_func); ++#endif ++ (*dl_elf_func) (); ++ } ++ } ++ if (tpnt->dynamic_info[DT_FINI]) { ++ void (*dl_elf_func) (void); ++ dl_elf_func = (void (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]); ++ if (dl_elf_func && *dl_elf_func != NULL) { ++#ifdef __SUPPORT_LD_DEBUG__ ++ if(_dl_debug) ++ _dl_dprintf(2, "setting up dtors for library %s at '%x'\n", tpnt->libname, dl_elf_func); ++#endif ++ atexit(dl_elf_func); ++ } ++ } ++ } ++#endif ++ return (void *) dyn_chain; ++ ++oops: ++ /* Something went wrong. Clean up and return NULL. */ ++ _dl_unmap_cache(); ++ do_dlclose(dyn_chain, 0); ++ return NULL; ++} ++ ++void *_dlsym(void *vhandle, const char *name) ++{ ++ struct elf_resolve *tpnt, *tfrom; ++ struct dyn_elf *handle; ++ ElfW(Addr) from; ++ struct dyn_elf *rpnt; ++ void *ret; ++ ++ handle = (struct dyn_elf *) vhandle; ++ ++ /* First of all verify that we have a real handle ++ of some kind. Return NULL if not a valid handle. */ ++ ++ if (handle == NULL) ++ handle = _dl_symbol_tables; ++ else if (handle != RTLD_NEXT && handle != _dl_symbol_tables) { ++ for (rpnt = _dl_handles; rpnt; rpnt = rpnt->next_handle) ++ if (rpnt == handle) ++ break; ++ if (!rpnt) { ++ _dl_error_number = LD_BAD_HANDLE; ++ return NULL; ++ } ++ } else if (handle == RTLD_NEXT) { ++ /* ++ * Try and locate the module we were called from - we ++ * need this so that we know where to start searching ++ * from. We never pass RTLD_NEXT down into the actual ++ * dynamic loader itself, as it doesn't know ++ * how to properly treat it. ++ */ ++ from = (ElfW(Addr)) __builtin_return_address(0); ++ ++ tfrom = NULL; ++ for (rpnt = _dl_symbol_tables; rpnt; rpnt = rpnt->next) { ++ tpnt = rpnt->dyn; ++ if (tpnt->loadaddr < from ++ && (tfrom == NULL || tfrom->loadaddr < tpnt->loadaddr)) { ++ tfrom = tpnt; ++ handle = rpnt->next; ++ } ++ } ++ } ++ ++ ret = _dl_find_hash((char*)name, handle, NULL, copyrel); ++ ++ /* ++ * Nothing found. ++ */ ++ if (!ret) ++ _dl_error_number = LD_NO_SYMBOL; ++ return ret; ++} ++ ++int _dlclose(void *vhandle) ++{ ++ return do_dlclose(vhandle, 1); ++} ++ ++static int do_dlclose(void *vhandle, int need_fini) ++{ ++ struct dyn_elf *rpnt, *rpnt1; ++ struct dyn_elf *spnt, *spnt1; ++ ElfW(Phdr) *ppnt; ++ struct elf_resolve *tpnt; ++ int (*dl_elf_fini) (void); ++ void (*dl_brk) (void); ++ struct dyn_elf *handle; ++ unsigned int end; ++ int i = 0; ++ ++ handle = (struct dyn_elf *) vhandle; ++ rpnt1 = NULL; ++ for (rpnt = _dl_handles; rpnt; rpnt = rpnt->next_handle) { ++ if (rpnt == handle) { ++ break; ++ } ++ rpnt1 = rpnt; ++ } ++ ++ if (!rpnt) { ++ _dl_error_number = LD_BAD_HANDLE; ++ return 1; ++ } ++ ++ /* OK, this is a valid handle - now close out the file. ++ * We check if we need to call fini () on the handle. */ ++ spnt = need_fini ? handle : handle->next; ++ for (; spnt; spnt = spnt1) { ++ spnt1 = spnt->next; ++ ++ /* We appended the module list to the end - when we get back here, ++ quit. The access counts were not adjusted to account for being here. */ ++ if (spnt == _dl_symbol_tables) ++ break; ++ if (spnt->dyn->usage_count == 1 ++ && spnt->dyn->libtype == loaded_file) { ++ tpnt = spnt->dyn; ++ /* Apparently crt1 for the application is responsible for handling this. ++ * We only need to run the init/fini for shared libraries ++ */ ++ ++ if (tpnt->dynamic_info[DT_FINI]) { ++ dl_elf_fini = (int (*)(void)) (tpnt->loadaddr + ++ tpnt->dynamic_info[DT_FINI]); ++ (*dl_elf_fini) (); ++ } ++ } ++ } ++ if (rpnt1) ++ rpnt1->next_handle = rpnt->next_handle; ++ else ++ _dl_handles = rpnt->next_handle; ++ ++ /* OK, this is a valid handle - now close out the file */ ++ for (rpnt = handle; rpnt; rpnt = rpnt1) { ++ rpnt1 = rpnt->next; ++ ++ /* We appended the module list to the end - when we get back here, ++ quit. The access counts were not adjusted to account for being here. */ ++ if (rpnt == _dl_symbol_tables) ++ break; ++ ++ rpnt->dyn->usage_count--; ++ if (rpnt->dyn->usage_count == 0 ++ && rpnt->dyn->libtype == loaded_file) { ++ tpnt = rpnt->dyn; ++ /* Apparently crt1 for the application is responsible for handling this. ++ * We only need to run the init/fini for shared libraries ++ */ ++#if 0 ++ ++ /* We have to do this above, before we start closing objects. ++ * Otherwise when the needed symbols for _fini handling are ++ * resolved a coredump would occur. Rob Ryan (robr@cmu.edu)*/ ++ if (tpnt->dynamic_info[DT_FINI]) { ++ dl_elf_fini = (int (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]); ++ (*dl_elf_fini) (); ++ } ++#endif ++ end = 0; ++ for (i = 0, ppnt = rpnt->dyn->ppnt; ++ i < rpnt->dyn->n_phent; ppnt++, i++) { ++ if (ppnt->p_type != PT_LOAD) ++ continue; ++ if (end < ppnt->p_vaddr + ppnt->p_memsz) ++ end = ppnt->p_vaddr + ppnt->p_memsz; ++ } ++ _dl_munmap((void*)rpnt->dyn->loadaddr, end); ++ /* Next, remove rpnt->dyn from the loaded_module list */ ++ if (_dl_loaded_modules == rpnt->dyn) { ++ _dl_loaded_modules = rpnt->dyn->next; ++ if (_dl_loaded_modules) ++ _dl_loaded_modules->prev = 0; ++ } else ++ for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) ++ if (tpnt->next == rpnt->dyn) { ++ tpnt->next = tpnt->next->next; ++ if (tpnt->next) ++ tpnt->next->prev = tpnt; ++ break; ++ } ++ free(rpnt->dyn->libname); ++ free(rpnt->dyn); ++ } ++ free(rpnt); ++ } ++ ++ ++ if (_dl_debug_addr) { ++ dl_brk = (void (*)(void)) _dl_debug_addr->r_brk; ++ if (dl_brk != NULL) { ++ _dl_debug_addr->r_state = RT_DELETE; ++ (*dl_brk) (); ++ ++ _dl_debug_addr->r_state = RT_CONSISTENT; ++ (*dl_brk) (); ++ } ++ } ++ ++ return 0; ++} ++ ++const char *_dlerror(void) ++{ ++ const char *retval; ++ ++ if (!_dl_error_number) ++ return NULL; ++ retval = dl_error_names[_dl_error_number]; ++ _dl_error_number = 0; ++ return retval; ++} ++ ++/* ++ * Dump information to stderrr about the current loaded modules ++ */ ++static char *type[] = { "Lib", "Exe", "Int", "Mod" }; ++ ++void _dlinfo(void) ++{ ++ struct elf_resolve *tpnt; ++ struct dyn_elf *rpnt, *hpnt; ++ ++ _dl_dprintf(2, "List of loaded modules\n"); ++ /* First start with a complete list of all of the loaded files. */ ++ for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) { ++ _dl_dprintf(2, "\t%x %x %x %s %d %s\n", ++ (unsigned) tpnt->loadaddr, (unsigned) tpnt, ++ (unsigned) tpnt->symbol_scope, ++ type[tpnt->libtype], ++ tpnt->usage_count, tpnt->libname); ++ } ++ ++ /* Next dump the module list for the application itself */ ++ _dl_dprintf(2, "\nModules for application (%x):\n", ++ (unsigned) _dl_symbol_tables); ++ for (rpnt = _dl_symbol_tables; rpnt; rpnt = rpnt->next) ++ _dl_dprintf(2, "\t%x %s\n", (unsigned) rpnt->dyn, rpnt->dyn->libname); ++ ++ for (hpnt = _dl_handles; hpnt; hpnt = hpnt->next_handle) { ++ _dl_dprintf(2, "Modules for handle %x\n", (unsigned) hpnt); ++ for (rpnt = hpnt; rpnt; rpnt = rpnt->next) ++ _dl_dprintf(2, "\t%x %s\n", (unsigned) rpnt->dyn, ++ rpnt->dyn->libname); ++ } ++} ++ ++int _dladdr(void *__address, Dl_info * __dlip) ++{ ++ struct elf_resolve *pelf; ++ struct elf_resolve *rpnt; ++ ++ _dl_map_cache(); ++ ++ /* ++ * Try and locate the module address is in ++ */ ++ pelf = NULL; ++ ++#if 0 ++ _dl_dprintf(2, "dladdr( %x, %x )\n", __address, __dlip); ++#endif ++ ++ for (rpnt = _dl_loaded_modules; rpnt; rpnt = rpnt->next) { ++ struct elf_resolve *tpnt; ++ ++ tpnt = rpnt; ++#if 0 ++ _dl_dprintf(2, "Module \"%s\" at %x\n", ++ tpnt->libname, tpnt->loadaddr); ++#endif ++ if (tpnt->loadaddr < (ElfW(Addr)) __address ++ && (pelf == NULL || pelf->loadaddr < tpnt->loadaddr)) { ++ pelf = tpnt; ++ } ++ } ++ ++ if (!pelf) { ++ return 0; ++ } ++ ++ /* ++ * Try and locate the symbol of address ++ */ ++ ++ { ++ char *strtab; ++ Elf32_Sym *symtab; ++ int hn, si; ++ int sf; ++ int sn = 0; ++ ElfW(Addr) sa; ++ ++ sa = 0; ++ symtab = (Elf32_Sym *) (pelf->dynamic_info[DT_SYMTAB] + pelf->loadaddr); ++ strtab = (char *) (pelf->dynamic_info[DT_STRTAB] + pelf->loadaddr); ++ ++ sf = 0; ++ for (hn = 0; hn < pelf->nbucket; hn++) { ++ for (si = pelf->elf_buckets[hn]; si; si = pelf->chains[si]) { ++ ElfW(Addr) symbol_addr; ++ ++ symbol_addr = pelf->loadaddr + symtab[si].st_value; ++ if (symbol_addr <= (ElfW(Addr))__address && (!sf || sa < symbol_addr)) { ++ sa = symbol_addr; ++ sn = si; ++ sf = 1; ++ } ++#if 0 ++ _dl_dprintf(2, "Symbol \"%s\" at %x\n", ++ strtab + symtab[si].st_name, symbol_addr); ++#endif ++ } ++ } ++ ++ if (sf) { ++ __dlip->dli_fname = pelf->libname; ++ __dlip->dli_fbase = (void *)pelf->loadaddr; ++ __dlip->dli_sname = strtab + symtab[sn].st_name; ++ __dlip->dli_saddr = (void *)sa; ++ } ++ return 1; ++ } ++} +diff -urN uClibc/ldso-0.9.24/man/Makefile uClibc.ldso.24/ldso-0.9.24/man/Makefile +--- uClibc/ldso-0.9.24/man/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/man/Makefile 2003-10-18 05:18:37.000000000 -0500 +@@ -0,0 +1,33 @@ ++# Makefile for uClibc ++# ++# Copyright (C) 2000,2001 Erik Andersen ++# ++# This program is free software; you can redistribute it and/or modify it under ++# the terms of the GNU Library 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 Library General Public License for more ++# details. ++# ++# You should have received a copy of the GNU Library 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 ++# ++# Derived in part from the Linux-8086 C library, the GNU C Library, and several ++# other sundry sources. Files within this library are copyright by their ++# respective copyright holders. ++ ++include ../Config.mk ++ ++ALL = #ld.so.info ++ ++all: $(ALL) ++ ++ld.so.info: ld.so.texi ++ makeinfo $< ++ ++clean: ++ $(RM) $(ALL) *~ +diff -urN uClibc/ldso-0.9.24/man/dlopen.3 uClibc.ldso.24/ldso-0.9.24/man/dlopen.3 +--- uClibc/ldso-0.9.24/man/dlopen.3 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/man/dlopen.3 2001-04-23 12:43:54.000000000 -0500 +@@ -0,0 +1,218 @@ ++.\" -*- nroff -*- ++.\" Copyright 1995 Yggdrasil Computing, Incorporated. ++.\" written by Adam J. Richter (adam@yggdrasil.com), ++.\" with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com). ++.\" ++.\" This is free documentation; 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. ++.\" ++.\" The GNU General Public License's references to "object code" ++.\" and "executables" are to be interpreted as the output of any ++.\" document formatting or typesetting system, including ++.\" intermediate and printed output. ++.\" ++.\" This manual 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 manual; if not, write to the Free ++.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, ++.\" USA. ++.\" ++.TH DLOPEN 3 "16 May 1995" "Linux" "Linux Programmer's Manual" ++.SH NAME ++dlclose, dlerror, dlopen, dlsym \- Programming interface to dynamic linking loader. ++.SH SYNOPSIS ++.B #include ++.sp ++.BI "void *dlopen (const char *" "filename" ", int " flag "); ++.br ++.BI "const char *dlerror(void);" ++.br ++.BI "void *dlsym(void *"handle ", char *"symbol ");" ++.br ++.BI "int dladdr(void *"address ", Dl_info *"dlip ");" ++.br ++.BI "int dlclose (void *"handle "); ++.sp ++Special symbols: ++.BR "_init" ", " "_fini" ". " ++.SH DESCRIPTION ++.B dlopen ++loads a dynamic library from the file named by the null terminated ++string ++.I filename ++and returns an opaque "handle" for the dynamic library. ++If ++.I filename ++is not an absolute path (i.e., it does not begin with a "/"), then the ++file is searched for in the following locations: ++.RS ++.PP ++A colon-separated list of directories in the user's ++\fBLD_LIBRARY\fP path environment variable. ++.PP ++The list of libraries specified in \fI/etc/ld.so.cache\fP. ++.PP ++\fI/usr/lib\fP, followed by \fI/lib\fP. ++.RE ++.PP ++If ++.I filename ++is a NULL pointer, then the returned handle is for the main program. ++.PP ++External references in the library are resolved using the libraries ++in that library's dependency list and any other libraries previously ++opened with the ++.B RTLD_GLOBAL ++flag. ++If the executable was linked ++with the flag "-rdynamic", then the global symbols in the executable ++will also be used to resolve references in a dynamically loaded ++library. ++.PP ++.I flag ++must be either ++.BR RTLD_LAZY , ++meaning resolve undefined symbols as code from the dynamic library is ++executed, or ++.BR RTLD_NOW , ++meaning resolve all undefined symbols before ++.B dlopen ++returns, and fail if this cannot be done. ++Optionally, ++.B RTLD_GLOBAL ++may be or'ed with ++.IR flag, ++in which case the external symbols defined in the library will be ++made available to subsequently loaded libraries. ++.PP ++If the library exports a routine named ++.BR _init , ++then that code is executed before dlopen returns. ++If the same library is loaded twice with ++.BR dlopen() , ++the same file handle is returned. The dl library maintains link ++counts for dynamic file handles, so a dynamic library is not ++deallocated until ++.B dlclose ++has been called on it as many times as ++.B dlopen ++has succeeded on it. ++.PP ++If ++.B dlopen ++fails for any reason, it returns NULL. ++A human readable string describing the most recent error that occurred ++from any of the dl routines (dlopen, dlsym or dlclose) can be ++extracted with ++.BR dlerror() . ++.B dlerror ++returns NULL if no errors have occurred since initialization or since ++it was last called. (Calling ++.B dlerror() ++twice consecutively, will always result in the second call returning ++NULL.) ++ ++.B dlsym ++takes a "handle" of a dynamic library returned by dlopen and the null ++terminated symbol name, returning the address where that symbol is ++loaded. If the symbol is not found, ++.B dlsym ++returns NULL; however, the correct way to test for an error from ++.B dlsym ++is to save the result of ++.B dlerror ++into a variable, and then check if saved value is not NULL. ++This is because the value of the symbol could actually be NULL. ++It is also necessary to save the results of ++.B dlerror ++into a variable because if ++.B dlerror ++is called again, it will return NULL. ++.PP ++.B dladdr ++returns information about the shared library containing the memory ++location specified by ++.IR address . ++.B dladdr ++returns zero on success and non-zero on error. ++.PP ++.B dlclose ++decrements the reference count on the dynamic library handle ++.IR handle . ++If the reference count drops to zero and no other loaded libraries use ++symbols in it, then the dynamic library is unloaded. If the dynamic ++library exports a routine named ++.BR _fini , ++then that routine is called just before the library is unloaded. ++.SH EXAMPLES ++.B Load the math library, and print the cosine of 2.0: ++.RS ++.nf ++.if t .ft CW ++#include ++ ++int main(int argc, char **argv) { ++ void *handle = dlopen ("/lib/libm.so", RTLD_LAZY); ++ double (*cosine)(double) = dlsym(handle, "cos"); ++ printf ("%f\\n", (*cosine)(2.0)); ++ dlclose(handle); ++} ++.if t .ft P ++.fi ++.PP ++If this program were in a file named "foo.c", you would build the program ++with the following command: ++.RS ++.LP ++gcc -rdynamic -o foo foo.c -ldl ++.RE ++.RE ++.LP ++.B Do the same thing, but check for errors at every step: ++.RS ++.nf ++.if t .ft CW ++#include ++#include ++ ++int main(int argc, char **argv) { ++ void *handle; ++ double (*cosine)(double); ++ char *error; ++ ++ handle = dlopen ("/lib/libm.so", RTLD_LAZY); ++ if (!handle) { ++ fputs (dlerror(), stderr); ++ exit(1); ++ } ++ ++ cosine = dlsym(handle, "cos"); ++ if ((error = dlerror()) != NULL) { ++ fputs(error, stderr); ++ exit(1); ++ } ++ ++ printf ("%f\\n", (*cosine)(2.0)); ++ dlclose(handle); ++} ++.if t .ft P ++.fi ++.RE ++.SH ACKNOWLEDGEMENTS ++The dlopen interface standard comes from Solaris. ++The Linux dlopen implementation was primarily written by ++Eric Youngdale with help from Mitch D'Souza, David Engel, ++Hongjiu Lu, Andreas Schwab and others. ++The manual page was written by Adam Richter. ++.SH SEE ALSO ++.BR ld(1) , ++.BR ld.so(8) , ++.BR ldconfig(8) , ++.BR ldd(1) , ++.BR ld.so.info . +diff -urN uClibc/ldso-0.9.24/man/ld.so.8 uClibc.ldso.24/ldso-0.9.24/man/ld.so.8 +--- uClibc/ldso-0.9.24/man/ld.so.8 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/man/ld.so.8 2001-04-23 12:43:54.000000000 -0500 +@@ -0,0 +1,113 @@ ++.TH ld.so 8 "14 March 1998" ++.SH NAME ++ld.so/ld-linux.so \- dynamic linker/loader ++.SH DESCRIPTION ++.B ld.so ++loads the shared libraries needed by a program, prepares the program ++to run, and then runs it. ++Unless explicitly specified via the ++.B \-static ++option to ++.B ld ++during compilation, all Linux programs are incomplete and require ++further linking at run time. ++.PP ++The necessary shared libraries needed by the program are searched for ++in the following order ++.IP o ++Using the environment variable ++.B LD_LIBRARY_PATH ++.RB ( LD_AOUT_LIBRARY_PATH ++for a.out programs). ++Except if the executable is a setuid/setgid binary, in which case it ++is ignored. ++.IP o ++From the cache file ++.BR /etc/ld.so.cache ++which contains a compiled list of candidate libraries previously found ++in the augmented library path. ++.IP o ++In the default path ++.BR /usr/lib , ++and then ++.BR /lib . ++.SH ENVIRONMENT ++.TP ++.B LD_LIBRARY_PATH ++A colon-separated list of directories in which to search for ++ELF libraries at execution-time. ++Similar to the ++.B PATH ++environment variable. ++.TP ++.B LD_PRELOAD ++A whitespace-separated list of additional, user-specified, ELF shared ++libraries to be loaded before all others. ++This can be used to selectively override functions in other shared libraries. ++For setuid/setgid ELF binaries, only libraries in the standard search ++directories that are also setgid will be loaded. ++.TP ++.B LD_TRACE_LOADED_OBJECTS ++If present, causes the program to list its dynamic library dependencies, ++as if run by ldd, instead of running normally. ++.TP ++.B LD_BIND_NOW ++If present, causes the dynamic linker to resolve all symbols at program ++startup instead of when they are first referenced. ++.TP ++.B LD_AOUT_LIBRARY_PATH ++A colon-separated list of directories in which to search for ++a.out libraries at execution-time. ++Similar to the ++.B PATH ++environment variable. ++.TP ++.B LD_AOUT_PRELOAD ++The name of an additional, user-specified, a.out shared library to be loaded ++after all others. ++This can be used to selectively override functions in other shared libraries. ++.TP ++.B LD_NOWARN ++Suppress warnings about a.out libraries with incompatible minor ++version numbers. ++.TP ++.B LD_KEEPDIR ++Don't ignore the directory in the names of a.out libraries to be loaded. ++Use of this option is strongly discouraged. ++.SH FILES ++.PD 0 ++.TP 20 ++.B /lib/ld.so ++a.out dynamic linker/loader ++.TP 20 ++.B /lib/ld-linux.so.* ++ELF dynamic linker/loader ++.TP ++.B /etc/ld.so.cache ++File containing a compiled list of directories in which to search for ++libraries and an ordered list of candidate libraries. ++.TP ++.B /etc/ld.so.preload ++File containing a whitespace separated list of ELF shared libraries to ++be loaded before the program. ++libraries and an ordered list of candidate libraries. ++.TP ++.B lib*.so* ++shared libraries ++.PD ++.SH SEE ALSO ++.BR ldd (1), ++.BR ldconfig (8). ++.SH BUGS ++.LP ++Currently ++.B ld.so ++has no means of unloading and searching for compatible or newer version of ++libraries. ++.PP ++.B ld.so ++functionality is only available for executables compiled using libc version ++4.4.3 or greater. ++.SH AUTHORS ++David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Linus ++Torvalds, Lars Wirzenius and Mitch D'Souza (not necessarily in that order). +diff -urN uClibc/ldso-0.9.24/man/ld.so.texi uClibc.ldso.24/ldso-0.9.24/man/ld.so.texi +--- uClibc/ldso-0.9.24/man/ld.so.texi 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/man/ld.so.texi 2001-04-23 12:43:54.000000000 -0500 +@@ -0,0 +1,411 @@ ++\input texinfo @c -*-texinfo-*- ++@c %**start of header ++@setfilename ld.so.info ++@settitle ld.so : Dynamic-Link Library support ++@c %**end of header ++ ++@ifinfo ++This file documents the dynamic-link support libraries and utilities for the ++Linux OS, version 1.8.1. ++ ++Copyright 1996 Michael Deutschmann ++ ++This document is subject to the GNU General Public License as published by ++the Free Software foundation, version 2 or later (your choice). ++ ++Note: The software described in this document is under a different copyright ++and license. ++ ++@end ifinfo ++ ++@titlepage ++@title ld.so ++@subtitle Dynamic Link library support for the Linux OS. ++@author David Engel ++@author Eric Youngdale ++@author Peter Macdonald ++@author Hongjiu Lu ++@author Mitch D'Souza ++@author Michael Deutschmann (this documentation) ++ ++@page ++Copyright @copyright{} 1996 Michael Deutschmann ++ ++This document is subject to the GNU General Public License as published by ++the Free Software foundation, version 2 or later (your choice). ++ ++Note: The software described in this document is under a different copyright ++and license. ++@end titlepage ++ ++@ifinfo ++@node Top ++@top ++ ++The @code{ld.so} module provides dynamic linked library support in Linux. ++This file documents @code{ld.so} and its companion software. ++ ++@menu ++* intro:: Introduction ++ ++* ld.so:: The dynamic linker core program ++* ldd:: A utility to print out dependencies ++* ldconfig:: A utility to maintain the cache and symlinks ++* libdl:: Manual dynamic linking library ++@end menu ++ ++@end ifinfo ++ ++@node intro ++@unnumbered Introduction ++ ++The @code{ld.so} suite contains special files and utilities needed for linux ++to handle @dfn{dynamic libraries}. ++ ++Ordinary static libraries (@file{lib*.a} files) are included into executables ++that use their functions. A file that only uses static libraries needs less ++intelligence to load, but takes up more space. If many executables use the ++same library, there can be much wastage of storage space, since multiple ++copies of the library functions are scattered across the executables. ++However, static libraries are easier to make. ++ ++Dynamic libraries (@file{lib*.so*} files) are not copied into executables --- ++the executable is written in such a way that it will automatically load the ++libraries. In linux, the executable will first load the special library ++@code{ld.so} or @code{ld-linux.so}, which contains the intelligence ++to load further dynamic libraries. Since multiple files end up getting ++executable data from the same file, dynamic libraries are also known as ++shared libraries. ++ ++Linux executables come in two flavors, @sc{elf} and a.out. ++ ++a.out is the original executable format used by Linux. It has somewhat less ++overhead than @sc{elf}. However creating shared libraries for a.out is ++@emph{very} involved, and each a.out shared library must be explicitly ++registered. ++ ++@sc{elf} is a more recent format, which supports a much simpler method of ++creating libraries. @sc{elf} libraries may also be linked manually ++(@pxref{libdl}). ++ ++Since many library authors prefer @sc{elf} and no longer release shared a.out ++libraries, a.out is moribund on Linux. This version of the @code{ld.so} can ++be compiled to support only @sc{elf}, or to support both formats. (The last ++release of ld.so to support a.out alone was 1.8.0.) ++ ++@node ld.so ++@chapter @code{ld.so}: Dynamic linker core ++ ++@code{ld.so} works behind the scenes to handle dynamic libraries in Linux. ++Users will almost never have to deal with it directly, but in special cases ++one can send instructions to it through environment variables. Also, if ++something is wrong with your libraries (usually an incorrect version) ld.so ++will give error messages. ++ ++Actually @code{ld.so} is the a.out linker. The new @sc{elf} executables are ++handled by a related program @code{ld-linux.so}. ++ ++@menu ++* files:: Configuration files used by the suite ++* environment:: Environment settings that tweak @code{ld.so} ++* errors:: Complaints @code{ld.so} might make ++@end menu ++ ++@node files ++@section Configuration Files ++ ++@table @file ++@item /etc/ld.so.cache ++A file created by @code{ldconfig} and used to speed linking. It's structure ++is private to the suite. ++ ++@item /etc/ld.so.conf ++A simple list of directories to scan for libraries, in addition to ++@file{/usr/lib} and @file{/lib}, which are hardwired. It may contain ++comments started with a @samp{#}. ++ ++@item /etc/ld.so.preload ++A list of libraries to preload. This allows preloading libraries for ++setuid/setgid executables securely. It may contain comments. ++@end table ++ ++@node environment ++@section Environment Variables ++ ++@table @code ++@item LD_AOUT_LIBRARY_PATH ++@itemx LD_LIBRARY_PATH ++These variables supply a library path for finding dynamic libraries, in the ++standard colon seperated format. These variables are ignored when executing ++setuid/setgid programs, because otherwise they would be a security hazard. ++@code{ld.so} will use @code{LD_AOUT_LIBRARY_PATH} and @code{ld-linux.so} will ++use @code{LD_LIBRARY_PATH}. ++ ++@item LD_AOUT_PRELOAD ++@itemx LD_PRELOAD ++These variables allow an extra library not specified in the executable to be ++loaded. Generally this is only useful if you want to override a function. ++These are also ignored when running setuid/setgid executables. @code{ld.so} ++will use @code{LD_AOUT_PRELOAD} and @code{ld-linux.so} will use ++@code{LD_PRELOAD}. ++ ++@item LD_NOWARN ++If non-empty, errors about incompatible minor revisions are suppressed. ++ ++@item LD_KEEPDIR ++If non-empty, allow executables to specify absolute library names. This ++option is deprecated. ++@c FIXME: ++@c The following are things I noticed in the ld-linux.so source. ++@c I don't really understand 'em. Could someone help me? ++@c ++@c @item LD_BIND_NOW ++@c This option is used by the @code{ld-linux.so} only. I don't know ++@c what it does. (I suspect, looking at the code, that it specifies ++@c "RTLD_NOW" rather than "RTLD_LAZY" mode for the shared libraries.) ++@c ++@c @item LD_TRACE_LOADED_OBJECTS ++@c @itemx LD_WARN ++@c These seem to have something to do with the communication between the ++@c @code{ld-linux.so} and @code{ldd}. I don't know more. ++@end table ++ ++@node errors ++@section Errors ++ ++@table @samp ++@item Can't find library @var{library} ++The executable required a dynamically linked library that ld.so cannot find. ++Your symbolic links may be not set right, or you may have not installed a ++library needed by the program. ++ ++@item Can't load library @var{library} ++The library is corrupt. ++ ++@item Incompatible library @var{library} ++@itemx Require major version @var{x} and found @var{y} ++Your version of the library is incompatible with the executable. Recompiling ++the executable, or upgrading the library will fix the problem. ++ ++@item using incompatible library @var{library} ++@itemx Desire minor version >= @var{x} and found @var{y}. ++Your version of the library is older than that expected by the executable, ++but not so old that the library interface has radically changed, so the ++linker will attempt to run anyway. There is a chance that it will work, but ++you should upgrade the library or recompile the software. The environment ++variable @code{LD_NOWARN} can be used to supress this message. ++ ++@item too many directories in library path ++The linker only supports up to 32 library directories. You have too many. ++ ++@item dynamic linker error in @var{blah} ++The linker is having trouble handling a binary - it is probably corrupt. ++ ++@item can't map cache file @var{cache-file} ++@itemx cache file @var{cache-file} @var{blah} ++The linker cache file (generally @file{/etc/ld.so.cache}) is corrupt or ++non-existent. These errors can be ignored, and can be prevented by ++regenerating the cache file with @code{ldconfig}. ++@end table ++ ++@node ldd ++@chapter @code{ldd}: Dependency scanner ++ ++@code{ldd} is a utility that prints out the dynamic libraries that an ++executable is linked to. ++ ++Actually @code{ldd} works by signalling ld.so to print the dependencies. ++For a.out executables this is done by starting the executable with ++@code{argc} equal to 0. The linker detects this and prints the dependencies. ++(This can cause problems with @emph{very} old binaries, which would run as ++normal only with an inappropriate @code{argc}.) ++ ++For @sc{elf} executables, special environment variables are used to tell the ++linker to print the dependencies. ++ ++@code{ldd} has a few options: ++ ++@table @samp ++@item -v ++Print the version number of @code{ldd} itself ++ ++@item -V ++Print the version number of the dynamic linker ++ ++@item -d ++Report missing functions. This is only supported for @sc{elf} executables. ++ ++@item -r ++Report missing objects. This is also only available for @sc{elf} ++executables. ++@end table ++ ++@node ldconfig ++@chapter @code{ldconfig}: Setup program ++ ++This utility is used by the system administrator to automatically set up ++symbolic links needed by the libraries, and also to set up the cache file. ++ ++@code{ldconfig} is run after new dynamic libraries are installed, and if the ++cache file or links are damaged. It is also run when upgrading the ++@code{ld.so} suite itself. ++ ++The @file{/lib} and @file{/usr/lib} directories, and any listed in the file ++@file{/etc/ld.so.conf} are scanned by default unless @samp{-n} is used. ++Additional directories may be specified on the command line. ++ ++It has the following options: ++ ++@table @samp ++@item -D ++Enter debug mode. Implies @samp{-N} and @samp{-X}. ++ ++@item -v ++Verbose. Print out links created and directories scanned. ++ ++@item -n ++Check directories specified on the commandline @emph{only}. ++ ++@item -N ++Do not regenerate the cache. ++ ++@item -X ++Do not rebuild symbolic links. ++ ++@item -l ++Set up symbolic links for only libraries presented on the command line. ++ ++@item -p ++Print out the library pathnames in the cache file (@file{/etc/ld.so.cache}) ++@end table ++ ++@node libdl ++@chapter User dynamic linking library ++ ++The @code{ld.so} package includes a small library of functions ++(@code{libdl}) to allow manual dynamic linking. Normally programs are linked ++so that dynamic functions and objects are automagically available. These ++functions allow one to manually load and access a symbol from a library. ++They are only available for @sc{elf} executables. ++ ++@menu ++* using libdl:: General points ++* functions:: How to use the functions ++* example:: A sample program ++@end menu ++ ++@node using libdl ++@section Overview ++ ++To access this library, add the flag @samp{-ldl} to your compile command when ++linking the executable. You also must include the header file ++@code{dlfcn.h}. You may also need the flag @samp{-rdynamic}, which enables ++resolving references in the loaded libraries against your executable. ++ ++Generally, you will first use @code{dlopen} to open a library. Then you use ++@code{dlsym} one or more times to access symbols. Finally you use ++@code{dlclose} to close the library. ++ ++These facilities are most useful for language interpreters that provide ++access to external libraries. Without @code{libdl}, it would be neccessary ++to link the interpreter executable with any and all external libraries ++needed by the programs it runs. With @code{libdl}, the interpreter only ++needs to be linked with the libraries it uses itself, and can dynamically ++load in additional ones if programs need it. ++ ++@node functions ++@section Functions ++ ++@deftypefun void *dlopen ( const char @var{filename}, int @var{flags} ) ++ ++This function opens the dynamic library specified by @var{filename} ++and returns an abstract handle, which can be used in subsequent calls to ++@code{dlsym}. The function will respect the @code{LD_ELF_LIBRARY_PATH} and ++@code{LD_LIBRARY_PATH} environment variables. ++ ++@end deftypefun ++ ++The following flags can be used with @code{dlopen}: ++ ++@deftypevr Macro int RTLD_LAZY ++Resolve symbols in the library as they are needed. ++@end deftypevr ++ ++@deftypevr Macro int RTLD_NOW ++Resolve all symbols in the library before returning, and fail if not all can ++be resolved. This is mutually exclusive with @code{RTLD_LAZY}. ++@end deftypevr ++ ++@deftypevr Macro int RTLD_GLOBAL ++Make symbols in this library available for resolving symbols in other ++libraries loaded with @code{dlopen}. ++@end deftypevr ++ ++@deftypefun int dlclose ( void *@var{handle} ) ++ ++This function releases a library handle. ++ ++Note that if a library opened twice, the handle will be the same. However, ++a reference count is used, so you should still close the library as many ++times as you open it. ++ ++@end deftypefun ++ ++@deftypefun void *dlsym (void *@var{handle},char *@var{symbol-name}) ++ ++This function looks up the name @var{symbol-name} in the library and returns ++it in the void pointer. ++ ++If there is an error, a null pointer will be returned. However, it is ++possible for a valid name in the library to have a null value, so ++@code{dlerror} should be used to check if there was an error. ++ ++@end deftypefun ++ ++@deftypefun {libdl function} {const char} *dlerror( void ) ++ ++This function is used to read the error state. It returns a human-readable ++string describing the last error, or null, meaning no error. ++ ++The function resets the error value each time it is called, so the result ++should be copied into a variable. If the function is called more than once ++after an error, the second and subsequent calls will return null. ++ ++@end deftypefun ++ ++@node example ++@section Example program ++ ++Here is an example program that prints the cosine of two by manually linking ++to the math library: ++ ++@example ++@c The following was snarfed verbatim from the dlopen.3 man file. ++#include ++#include ++ ++int main(int argc, char **argv) @{ ++ void *handle; ++ double (*cosine)(double); ++ char *error; ++ ++ handle = dlopen ("/lib/libm.so", RTLD_LAZY); ++ if (!handle) @{ ++ fputs (dlerror(), stderr); ++ exit(1); ++ @} ++ ++ cosine = dlsym(handle, "cos"); ++ if ((error = dlerror()) != NULL) @{ ++ fputs(error, stderr); ++ exit(1); ++ @} ++ ++ printf ("%f\\n", (*cosine)(2.0)); ++ dlclose(handle); ++@} ++@end example ++ ++@contents ++ ++@bye +diff -urN uClibc/ldso-0.9.24/man/ldconfig.8 uClibc.ldso.24/ldso-0.9.24/man/ldconfig.8 +--- uClibc/ldso-0.9.24/man/ldconfig.8 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/man/ldconfig.8 2001-04-23 12:43:54.000000000 -0500 +@@ -0,0 +1,189 @@ ++.TH ldconfig 8 "14 March 1998" ++.SH NAME ++ldconfig \- determine run-time link bindings ++.SH SYNOPSIS ++ldconfig ++.RB [ \-DvqnNX ] ++.RB [ \-f\ conf ] ++.RB [ \-C\ cache ] ++.RB [ \-r\ root ] ++.IR directory \ ... ++.PD 0 ++.PP ++.PD ++ldconfig ++.B \-l ++.RB [ \-Dvq ] ++.IR library \ ... ++.PD 0 ++.PP ++.PD ++ldconfig ++.B \-p ++.SH DESCRIPTION ++.B ldconfig ++creates the necessary links and cache (for use by the run-time linker, ++.IR ld.so ) ++to the most recent shared libraries found in the directories specified ++on the command line, in the file ++.IR /etc/ld.so.conf , ++and in the trusted directories ++.RI ( /usr/lib ++and ++.IR /lib ). ++.B ldconfig ++checks the header and file names of the libraries it encounters when ++determining which versions should have their links updated. ++.B ldconfig ++ignores symbolic links when scanning for libraries. ++.PP ++.B ldconfig ++will attempt to deduce the type of ELF libs (ie. libc5 or libc6/glibc) ++based on what C libs if any the library was linked against, therefore when ++making dynamic libraries, it is wise to explicitly link against libc (use -lc). ++.PP ++Some existing libs do not contain enough information to allow the deduction of ++their type, therefore the ++.IR /etc/ld.so.conf ++file format allows the specification of an expected type. This is ++.B only ++used for those ELF libs which we can not work out. The format ++is like this "dirname=TYPE", where type can be libc4, libc5 or libc6. ++(This syntax also works on the command line). Spaces are ++.B not ++allowed. Also see the ++.B -p ++option. ++.PP ++Directory names containing an ++.B = are no longer legal ++unless they also have an expected type specifier. ++.PP ++.B ldconfig ++should normally be run by the super-user as it may require write ++permission on some root owned directories and files. ++It is normally run automatically at bootup, from /etc/rc, or manually ++whenever new DLL's are installed. ++.SH OPTIONS ++.TP ++.B \-D ++Debug mode. ++Implies ++.B \-N ++and ++.BR \-X . ++.TP ++.B \-v ++Verbose mode. ++Print current version number, the name of each directory as it ++is scanned and any links that are created. ++Overrides quiet mode. ++.TP ++.B \-q ++Quiet mode. ++Don't print warnings. ++.TP ++.B \-n ++Only process directories specified on the command line. ++Don't process the trusted directories ++.RI ( /usr/lib ++and ++.IR /lib ) ++nor those specified in ++.IR /etc/ld.so.conf . ++Implies ++.BR \-N . ++.TP ++.B \-N ++Don't rebuild the cache. ++Unless ++.B \-X ++is also specified, links are still updated. ++.TP ++.B \-X ++Don't update links. ++Unless ++.B \-N ++is also specified, the cache is still rebuilt. ++.TP ++.B \-f conf ++Use ++.B conf ++instead of ++.IR /etc/ld.so.conf . ++.TP ++.B \-C cache ++Use ++.B cache ++instead of ++.IR /etc/ld.so.cache . ++.TP ++.B \-r root ++Change to and use ++.B root ++as the root directory. ++.TP ++.B \-l ++Library mode. ++Manually link individual libraries. ++Intended for use by experts only. ++.TP ++.B \-p ++Print the lists of directories and candidate libraries stored in ++the current cache. ++.SH EXAMPLES ++In the bootup file ++.I /etc/rc ++having the line ++.RS ++ ++/sbin/ldconfig -v ++ ++.RE ++will set up the correct links for the shared binaries and rebuild ++the cache. ++.TP ++On the command line ++.RS ++ ++# /sbin/ldconfig -n /lib ++ ++.RE ++as root after the installation of a new DLL, will properly update the ++shared library symbolic links in /lib. ++ ++.SH FILES ++.PD 0 ++.TP 20 ++.B /lib/ld.so ++execution time linker/loader ++.TP 20 ++.B /etc/ld.so.conf ++File containing a list of colon, space, tab, newline, or comma spearated ++directories in which to search for libraries. ++.TP 20 ++.B /etc/ld.so.cache ++File containing an ordered list of libraries found in the directories ++specified in ++.BR /etc/ld.so.conf . ++.TP ++.B lib*.so.version ++shared libraries ++.PD ++.SH SEE ALSO ++.BR ldd (1), ++.BR ld.so (8). ++.SH BUGS ++.LP ++.BR ldconfig 's ++functionality, in conjunction with ++.BR ld.so , ++is only available for executables compiled using libc version 4.4.3 or greater. ++.PP ++.BR ldconfig , ++being a user process, must be run manually and has no means of dynamically ++determining and relinking shared libraries for use by ++.BR ld.so ++when a new DLL is installed. ++.SH AUTHORS ++David Engel and Mitch D'Souza. +diff -urN uClibc/ldso-0.9.24/man/ldd.1 uClibc.ldso.24/ldso-0.9.24/man/ldd.1 +--- uClibc/ldso-0.9.24/man/ldd.1 1969-12-31 18:00:00.000000000 -0600 ++++ uClibc.ldso.24/ldso-0.9.24/man/ldd.1 2001-04-23 12:43:54.000000000 -0500 +@@ -0,0 +1,59 @@ ++.\" Copyright 1995-2000 David Engel (david@ods.com) ++.\" Copyright 1995 Rickard E. Faith (faith@cs.unc.edu) ++.\" Most of this was copied from the README file. Do not restrict distribution. ++.\" May be distributed under the GNU General Public License ++.TH LDD 1 "14 March 1998" ++.SH NAME ++ldd \- print shared library dependencies ++.SH SYNOPSIS ++.B ldd ++.RB [ \-vVdr ] ++program|library ... ++.SH DESCRIPTION ++.B ldd ++prints the shared libraries required by each program or shared library ++specified on the command line. ++If a shared library name does not contain a '/', ++.B ldd ++attempts to locate the library in the standard locations. ++To run ++.B ldd ++on a shared library in the current directory, a "./" must be prepended ++to its name. ++.SH OPTIONS ++.TP ++.B \-v ++Print the version number of ++.BR ldd . ++.TP ++.B \-V ++Print the version number of the dynamic linker, ++.BR ld.so . ++.TP ++.B \-d ++Perform relocations and report any missing functions (ELF only). ++.TP ++.B \-r ++Perform relocations for both data objects and functions, and ++report any missing objects (ELF only). ++.SH BUGS ++.B ldd ++does not work very well on libc.so.5 itself. ++.PP ++.B ldd ++does not work on a.out shared libraries. ++.PP ++.B ldd ++does not work with some extremely old a.out programs which were ++built before ++.B ldd ++support was added to the compiler releases. ++If you use ++.B ldd ++on one of these programs, the program will attempt to run with argc = 0 and ++the results will be unpredictable. ++.SH AUTHOR ++David Engel. ++.SH SEE ALSO ++.BR ldconfig (8), ++.BR ld.so (8). diff --git a/obsolete-buildroot/sources/uClibc.config b/obsolete-buildroot/sources/uClibc.config new file mode 100644 index 0000000000..985f76d764 --- /dev/null +++ b/obsolete-buildroot/sources/uClibc.config @@ -0,0 +1,144 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +TARGET_mips=y +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="mips" +ARCH_CFLAGS="-mno-split-addresses" +ARCH_SUPPORTS_BIG_ENDIAN=y +# CONFIG_MIPS_ISA_1 is not set +CONFIG_MIPS_ISA_2=y +# CONFIG_MIPS_ISA_3 is not set +# CONFIG_MIPS_ISA_4 is not set +# CONFIG_MIPS_ISA_MIPS32 is not set +# CONFIG_MIPS_ISA_MIPS64 is not set +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/linux" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +# UCLIBC_PIE_SUPPORT is not set +LDSO_LDD_SUPPORT=y +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# UCLIBC_PROFILING is not set +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +# UCLIBC_HAS_WORDEXP is not set +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc" + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/obsolete-buildroot/sources/uClibc.config-locale b/obsolete-buildroot/sources/uClibc.config-locale new file mode 100644 index 0000000000..b8b7fc8374 --- /dev/null +++ b/obsolete-buildroot/sources/uClibc.config-locale @@ -0,0 +1,134 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +TARGET_ARCH="none" +# ARCH_LITTLE_ENDIAN is not set +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/linux" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +HAVE_SHARED=y +BUILD_UCLIBC_LDSO=y +# UCLIBC_PIE_SUPPORT is not set +LDSO_LDD_SUPPORT=y +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# UCLIBC_PROFILING is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +UCLIBC_HAS_LOCALE=y +UCLIBC_PREGENERATED_LOCALE_DATA=y +UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA=y +UCLIBC_HAS_XLOCALE=y +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_DIGIT_GROUPING=y +UCLIBC_HAS_SCANF_LENIENT_DIGIT_GROUPING=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GETTEXT_AWARENESS=y +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc" + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/obsolete-buildroot/sources/uClibc.config-openwrt b/obsolete-buildroot/sources/uClibc.config-openwrt new file mode 100644 index 0000000000..985f76d764 --- /dev/null +++ b/obsolete-buildroot/sources/uClibc.config-openwrt @@ -0,0 +1,144 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +TARGET_mips=y +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="mips" +ARCH_CFLAGS="-mno-split-addresses" +ARCH_SUPPORTS_BIG_ENDIAN=y +# CONFIG_MIPS_ISA_1 is not set +CONFIG_MIPS_ISA_2=y +# CONFIG_MIPS_ISA_3 is not set +# CONFIG_MIPS_ISA_4 is not set +# CONFIG_MIPS_ISA_MIPS32 is not set +# CONFIG_MIPS_ISA_MIPS64 is not set +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/linux" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +# UCLIBC_PIE_SUPPORT is not set +LDSO_LDD_SUPPORT=y +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# UCLIBC_PROFILING is not set +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +# UCLIBC_HAS_WORDEXP is not set +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc" +DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc" + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/obsolete-buildroot/sources/util-linux.patch b/obsolete-buildroot/sources/util-linux.patch new file mode 100644 index 0000000000..601e7dc11d --- /dev/null +++ b/obsolete-buildroot/sources/util-linux.patch @@ -0,0 +1,28 @@ +--- util-linux-2.11z/mount/fstab.c.orig 2003-12-03 15:28:22.000000000 -0700 ++++ util-linux-2.11z/mount/fstab.c 2003-12-03 15:28:41.000000000 -0700 +@@ -342,7 +342,7 @@ + /* Ensure that the lock is released if we are interrupted. */ + static void + handler (int sig) { +- die (EX_USER, "%s", sys_siglist[sig]); ++ die (EX_USER, "%s", strsignal(sig)); + } + + static void +--- /dev/null 2003-09-07 01:55:59.000000000 -0600 ++++ util-linux-2.11z/mount/swapargs.h 2003-12-03 15:44:50.000000000 -0700 +@@ -0,0 +1,3 @@ ++#define SWAPON_HAS_TWO_ARGS ++#include ++#include +--- util-linux-2.11z/mount/swap.configure.orig 2003-12-03 15:43:24.000000000 -0700 ++++ util-linux-2.11z/mount/swap.configure 2003-12-03 15:45:33.000000000 -0700 +@@ -1,6 +1,8 @@ + # Find out whether we can include + # and whether libc thinks that swapon() has two arguments. + ++exit 0 ++ + # Prepare test + CC=${CC-cc} + compile="$CC -o conftest conftest.c >/dev/null 2>&1" diff --git a/obsolete-buildroot/sources/valgrind.patch b/obsolete-buildroot/sources/valgrind.patch new file mode 100644 index 0000000000..d0946bd9c6 --- /dev/null +++ b/obsolete-buildroot/sources/valgrind.patch @@ -0,0 +1,115 @@ +--- valgrind-2.1.1.orig/coregrind/vg_syscalls.c 2004-02-24 17:07:10.000000000 -0700 ++++ valgrind-2.1.1/coregrind/vg_syscalls.c 2004-04-16 18:13:11.000000000 -0600 +@@ -3231,6 +3245,93 @@ + case CDROM_CLEAR_OPTIONS: /* 0x5321 */ + break; + ++ /* Stuff added by Erik Andersen for general device probing/handling */ ++#define BLKSSZGET _IO(0x12,104) ++ case BLKSSZGET: ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(BLKSSZGET)", arg3, ++ sizeof(int)); ++ break; ++#undef _IOR ++#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) ++#define BLKGETSIZE64 _IOR(0x12,114,sizeof(uint64_t)) ++ case BLKGETSIZE64: ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(BLKGETSIZE64)", arg3, ++ sizeof(uint64_t)); ++ break; ++#define HDIO_GETGEO 0x0301 /* get device geometry */ ++ case HDIO_GETGEO: ++ { ++ struct hd_geometry { ++ unsigned char heads; ++ unsigned char sectors; ++ unsigned short cylinders; ++ unsigned long start; ++ }; ++ ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(HDIO_GETGEO)", arg3, ++ sizeof(struct hd_geometry)); ++ } ++ break; ++#define HDIO_GET_IDENTITY 0x030d /* get IDE identification info */ ++#define struct_hd_driveid_size 256 /* ATA6 specifies words 0-255 */ ++ case HDIO_GET_IDENTITY: ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(HDIO_GET_IDENTITY)", arg3, ++ struct_hd_driveid_size); ++ break; ++#define SCSI_IOCTL_GET_IDLUN 0x5382 ++ case SCSI_IOCTL_GET_IDLUN: ++ { ++ struct scsi_idlun ++ { ++ int mux4; ++ int host_unique_id; ++ ++ }; ++ ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(SCSI_IOCTL_GET_IDLUN)", arg3, ++ sizeof(struct scsi_idlun)); ++ } ++ break; ++#define SCSI_IOCTL_SEND_COMMAND 1 ++ case SCSI_IOCTL_SEND_COMMAND: ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(SCSI_IOCTL_SEND_COMMAND)", arg3, ++ ((2 * sizeof(unsigned int)) + 6 + 512)); ++ break; ++#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386 ++ case SCSI_IOCTL_GET_BUS_NUMBER: ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(SCSI_IOCTL_GET_BUS_NUMBER)", arg3, ++ sizeof(int)); ++ break; ++#define SCSI_IOCTL_PROBE_HOST 0x5385 ++ case SCSI_IOCTL_PROBE_HOST: ++ { ++ int xxxx; ++ char *array = (char*)arg3; ++ xxxx = array[0] + (array[1]<<8) + (array[2]<<16) + (array[3]<<24); ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(SCSI_IOCTL_PROBE_HOST)", arg3, ++ sizeof(int)); ++ } ++ break; ++#define BLKFLSBUF _IO(0x12,97) ++ case BLKFLSBUF: ++ break; ++#define BLKRRPART _IO(0x12,95) ++ case BLKRRPART: ++ break; ++#define MTIOCTOP _IO(0x6d,0x1) ++ case MTIOCTOP: ++ { ++ struct mtop ++ { ++ short int mt_op; /* Operations defined below. */ ++ int mt_count; /* How many of them. */ ++ }; ++ SYSCALL_TRACK( pre_mem_write, tid, "ioctl(MTIOCTOP)", arg3, ++ sizeof(struct mtop)); ++ } ++ break; ++ ++ + /* We don't have any specific information on it, so + try to do something reasonable based on direction and + size bits. The encoding scheme is described in +--- valgrind-2.1.1.orig/coregrind/vg_libpthread.c 2004-03-08 08:57:17.000000000 -0700 ++++ valgrind-2.1.1/coregrind/vg_libpthread.c 2004-04-16 17:58:31.000000000 -0600 +@@ -3175,6 +3175,8 @@ + pthread_mutex). So basically, this is completely broken on recent + glibcs. */ + ++#ifndef __UCLIBC__ ++ + #undef _IO_flockfile + void _IO_flockfile ( _IO_FILE * file ) + { +@@ -3192,6 +3194,7 @@ + weak_alias(_IO_funlockfile, funlockfile); + #endif + ++#endif + + /* This doesn't seem to be needed to simulate libpthread.so's external + interface, but many people complain about its absence. */ diff --git a/obsolete-buildroot/sources/vtun.patch b/obsolete-buildroot/sources/vtun.patch new file mode 100644 index 0000000000..00a12454ee --- /dev/null +++ b/obsolete-buildroot/sources/vtun.patch @@ -0,0 +1,186 @@ +diff -urN vtun/Makefile.in vtun-2.6/Makefile.in +--- vtun/Makefile.in 2002-12-20 09:55:47.000000000 -0700 ++++ vtun-2.6/Makefile.in 2003-06-05 12:38:31.000000000 -0600 +@@ -28,7 +28,7 @@ + LEXFLAGS = -t + + INSTALL = @INSTALL@ +-INSTALL_OWNER = -o root -g 0 ++INSTALL_OWNER = + + prefix = @prefix@ + exec_prefix = @exec_prefix@ +@@ -86,15 +86,15 @@ + + install_config: + $(INSTALL) -d -m 755 $(INSTALL_OWNER) $(DESTDIR)$(ETC_DIR) +- if [ ! -f $(ETC_DIR)/vtund.conf ]; then \ +- $(INSTALL) -m 600 $(INSTALL_OWNER) vtund.conf $(DESTDIR)$(ETC_DIR); \ +- fi ++ $(INSTALL) -m 600 $(INSTALL_OWNER) vtund.conf $(DESTDIR)$(ETC_DIR); ++ $(INSTALL) -m 600 $(INSTALL_OWNER) scripts/vtund-start.conf $(DESTDIR)$(ETC_DIR); + + install: vtund install_config install_man +- $(INSTALL) -d -m 755 $(INSTALL_OWNER) $(DESTDIR)$(VAR_DIR)/run + $(INSTALL) -d -m 755 $(INSTALL_OWNER) $(DESTDIR)$(STAT_DIR) + $(INSTALL) -d -m 755 $(INSTALL_OWNER) $(DESTDIR)$(LOCK_DIR) + $(INSTALL) -d -m 755 $(INSTALL_OWNER) $(DESTDIR)$(SBIN_DIR) + $(INSTALL) -m 755 $(INSTALL_OWNER) vtund $(DESTDIR)$(SBIN_DIR) ++ $(INSTALL) -m 755 $(INSTALL_OWNER) scripts/vtund.rc.debian \ ++ $(DESTDIR)$(ETC_DIR)/init.d/S90vtun + + # DO NOT DELETE THIS LINE -- make depend depends on it. +diff -urN vtun/scripts/vtund.rc.debian vtun-2.6/scripts/vtund.rc.debian +--- vtun/scripts/vtund.rc.debian 2000-03-26 10:06:37.000000000 -0700 ++++ vtun-2.6/scripts/vtund.rc.debian 2003-06-05 12:38:46.000000000 -0600 +@@ -1,92 +1,48 @@ +-#! /usr/bin/perl -w ++#! /bin/sh ++# + +-### vtund-start +-### +-### script to start vtund as either a server or a client, according to +-### the config file /etc/vtund-start.conf +-### +-### Copyright 1999 Craig Sanders +-### +-### Written for the Debian GNU/Linux distribution. This script is free +-### software licensed under the terms of the GNU General Public License. +- +-$DAEMON="/usr/sbin/vtund" ; +- +-$do_what = shift ; +-$args="start|stop|reload|force-reload|restart" ; +-if ( $do_what !~ /^($args)$/i ) { +- print "Usage: /etc/init.d/vtun {$args}\n" ; +- exit 0 ; +-} +- +-$SSD="/sbin/start-stop-daemon" ; +-$SSDARGS="--verbose --exec $DAEMON" ; +- +-$sconf="/etc/vtund-start.conf" ; +-open(SCONF,"<$sconf") || die "couldn't open $sconf: $!\n" ; +-while () { +- chomp ; +- s/#.*//; +- s/^ +| +$//; +- next if (/^$/) ; +- +- @line = split ; +- $host = shift(@line) ; +- $server = shift(@line) ; +- $args = "" ; +- foreach (@line) { $args .= " $_" } ; +- +- $host='' if ($host =~ /--server--/i ) ; +- +- if ( $do_what eq 'start' ) { +- &start($host,$server,$args) ; +- } elsif ( $do_what eq 'stop' ) { +- &stop($host,$server,$args) ; +- } elsif ( $do_what eq 'restart' ) { +- &stop($pidfile) ; +- &start($host,$server,$args) ; +- } elsif ( $do_what =~ /^(reload|force-reload)$/ ) { +- &reload($host,$server) ; +- } +-} +-close (SCONF); +- +- +-sub start { +- my($host,$server,$args) = @_ ; +- print " Starting vtun " ; +- if ($host eq '') { +- print "server\n" ; +- system "$SSD --start $SSDARGS -- $args -s -P $server" ; +- } else { +- print "client $host to $server\n" ; +- $pidfile="/var/run/vtun.$host.$server" ; +- system "$SSD --start $SSDARGS --pidfile $pidfile -- $args $host $server" ; +- } +-} ; +- +-sub stop { +- my($host,$server,$args) = @_ ; +- print " Stopping vtun " ; +- if ($host eq '') { +- print "server\n" ; +- system "$SSD --stop $SSDARGS" ; +- } else { +- print "client $host to $server\n" ; +- $pidfile="/var/run/vtun.$host.$server" ; +- system "$SSD --stop $SSDARGS --pidfile $pidfile" ; +- } +-} ; +- +-sub reload { +- my($host,$server) = @_ ; +- print " Reloading vtun " ; +- if ($host eq '') { +- print "server\n" ; +- system "$SSD --stop $SSDARGS --signal 1" ; +- } else { +- print "client $host to $server\n" ; +- $pidfile="/var/run/vtun.$host.$server" ; +- system "$SSD --stop $SSDARGS --signal 1 --pidfile $pidfile" ; +- } +-} ++PATH=/bin:/usr/bin:/sbin:/usr/sbin ++DAEMON=/usr/sbin/vtund ++CONFFILE=/etc/vtund-start.conf ++PIDPREFIX=/var/run/vtund ++ ++test -f $DAEMON || exit 0 ++ ++case "$1" in ++ start) ++ # find all the defined tunnels ++ egrep -v '^[:space:]*(#.*)?$' $CONFFILE | while true; ++ do ++ read i ++ # no more lines available? done, then. ++ if [ $? != 0 ] ; then break; fi ++ SARGS=`echo $i|sed -ne 's/--server--\s*/-s -P /p'`; ++ if [ -n "$SARGS" ]; ++ then ++ echo "Starting vtund server." ++ start-stop-daemon -S -x $DAEMON -- $SARGS; ++ else ++ # split args into host and rest ++ HOST=`echo $i|cut -f 1 -d " "`; ++ TARGET=`echo $i|cut -f 2 -d " "`; ++ echo "Starting vtund client $HOST to $TARGET."; ++ start-stop-daemon -S -x $DAEMON -- $i; ++ fi ++ done ++ ;; ++ stop) ++ echo "Stopping vtund."; ++ start-stop-daemon -K -x vtund; ++ ;; ++ ++ restart|reload|force-reload) ++ $0 stop ++ sleep 1; ++ $0 start ++ ;; ++ *) ++ echo "Usage: $0 {start|stop|restart|reload|force-reload}" >&2 ++ exit 1 ++ ;; ++esac ++exit 0 +--- vtun-2.6/configure.dist 2004-03-11 10:39:10.000000000 -0600 ++++ vtun-2.6/configure 2004-03-11 10:45:52.000000000 -0600 +@@ -2112,7 +2112,7 @@ + echo $ac_n "checking "for blowfish.h"""... $ac_c" 1>&6 + echo "configure:2114: checking "for blowfish.h"" >&5 + ac_hdr_found=no +- for p in $BLOWFISH_HDR_DIR /usr/include/ssl /usr/include/openssl /usr/include /usr/local/include /usr/local/ssl/include /usr/include/crypto; do ++ for p in $BLOWFISH_HDR_DIR $SSL_HDR_DIR /usr/include/ssl /usr/include/openssl /usr/include /usr/local/include /usr/local/ssl/include /usr/include/crypto; do + if test -n "$p"; then + dir="$p" + else diff --git a/obsolete-buildroot/sources/yacc b/obsolete-buildroot/sources/yacc new file mode 100755 index 0000000000..aed120e88a --- /dev/null +++ b/obsolete-buildroot/sources/yacc @@ -0,0 +1,2 @@ +#!/bin/sh +exec /usr/bin/bison -y "$@" -- 2.30.2